This is an R Markdown Notebook. When you execute code within the notebook, the results appear beneath the code.

Add a new chunk by clicking the Insert Chunk button on the toolbar or by pressing Cmd+Option+I.

library(raster)
size_dat=read.table("/Users/stijnhantson/Documents/projects/VIIRS_ros/fire_growth_5days_v4.txt", header=T, row.names=NULL)

size_dat=as.data.frame(size_dat)
size_dat=size_dat[-1,]
size_dat=size_dat[,-1]
colnames(size_dat)=c("firename","year","cause","size1","size2","size3","size4","size5","final_firesize","mean_precip1","mean_precip2","mean_precip3","mean_precip4","mean_precip5","mean_tmax1","mean_tmax2","mean_tmax3","mean_tmax4","mean_tmax5","mean_tmean1","mean_tmean2","mean_tmean3","mean_tmean4","mean_tmean5","mean_vpdmax1","mean_vpdmax2","mean_vpdmax3","mean_vpdmax4","mean_vpdmax5","mean_windspeed1","mean_windspeed2","mean_windspeed3","mean_windspeed4","mean_windspeed5","landcover","ecosystem","biomass","elevation")

size_dat2 <- data.frame(lapply(size_dat, function(x) as.numeric(as.character(x))))
NAs introduced by coercion
size_dat2$human = 0
size_dat2$human[size_dat2$cause !=1 & size_dat2$cause !=14 & size_dat2$cause !=17]=1
size_dat2$human[size_dat2$cause ==1 ]=2

pro1 =size_dat2[which(size_dat2$human == 2 & size_dat2$landcover == 1 ), ]
pro2 =size_dat2[which(size_dat2$human == 1 & size_dat2$landcover == 1 ), ]

t.test(pro1$size1,pro2$size1)

    Welch Two Sample t-test

data:  pro1$size1 and pro2$size1
t = -2.0397, df = 74.381, p-value = 0.04493
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -22.0986230  -0.2593373
sample estimates:
mean of x mean of y 
 3.056385 14.235365 
t.test(pro1$size2,pro2$size2)

    Welch Two Sample t-test

data:  pro1$size2 and pro2$size2
t = -2.758, df = 73.138, p-value = 0.007341
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -32.702045  -5.266208
sample estimates:
mean of x mean of y 
 8.254394 27.238521 
t.test(pro1$size3,pro2$size3)

    Welch Two Sample t-test

data:  pro1$size3 and pro2$size3
t = -2.9002, df = 58.203, p-value = 0.005254
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -51.965993  -9.526741
sample estimates:
mean of x mean of y 
 14.10484  44.85121 
t.test(pro1$size4,pro2$size4)

    Welch Two Sample t-test

data:  pro1$size4 and pro2$size4
t = -3.1797, df = 53.078, p-value = 0.002461
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -74.99798 -16.98040
sample estimates:
mean of x mean of y 
 17.68430  63.67349 
t.test(pro1$size5,pro2$size5)

    Welch Two Sample t-test

data:  pro1$size5 and pro2$size5
t = -3.4218, df = 39.443, p-value = 0.001462
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -117.71273  -30.26844
sample estimates:
mean of x mean of y 
 19.71795  93.70853 
pro =size_dat2[which(size_dat2$human == 1 & size_dat2$landcover == 1), ]
length(pro$year)
[1] 68
boxplot(pro$size1,pro$size2,pro$size3,pro$size4,pro$size5,names=c("day1","day2","day3","day4","day5"),xlab="",ylab="fire size (km2)",ylim=c(0,500), cex.lab=1.4,cex.axis = 1.3)


pro =size_dat2[which(size_dat2$human == 2 & size_dat2$landcover == 1), ]
length(pro$year)
[1] 77
boxplot(pro$size1,pro$size2,pro$size3,pro$size4,pro$size5,names=c("day1","day2","day3","day4","day5"),xlab="",ylab="fire size (km2)",ylim=c(0,500), cex.lab=1.4,cex.axis = 1.3)


pro =size_dat2[which(size_dat2$human == 1 & size_dat2$landcover == 2), ]
length(pro$year)
[1] 18
boxplot(pro$size1,pro$size2,pro$size3,pro$size4,pro$size5,names=c("day1","day2","day3","day4","day5"),xlab="",ylab="fire size (km2)",ylim=c(0,500), cex.lab=1.4,cex.axis = 1.3)


pro =size_dat2[which(size_dat2$human == 2 & size_dat2$landcover == 2), ]
length(pro$year)
[1] 9
boxplot(pro$size1,pro$size2,pro$size3,pro$size4,pro$size5,names=c("day1","day2","day3","day4","day5"),xlab="",ylab="fire size (km2)",ylim=c(0,500), cex.lab=1.4,cex.axis = 1.3)

length(!is.na(pro$size5))
[1] 9
pro =size_dat2[which(size_dat2$human == 1 & size_dat2$ecosystem == 6), ]
length(pro$year)
[1] 41
boxplot(pro$size1,pro$size2,pro$size3,pro$size4,pro$size5,names=c("day1","day2","day3","day4","day5"),xlab="",ylab="fire size (km2)",ylim=c(0,500), cex.lab=1.4,cex.axis = 1.3)


pro =size_dat2[which(size_dat2$human == 2& size_dat2$ecosystem == 6), ]
length(pro$year)
[1] 79
boxplot(pro$size1,pro$size2,pro$size3,pro$size4,pro$size5,names=c("day1","day2","day3","day4","day5"),xlab="",ylab="fire size (km2)",ylim=c(0,500), cex.lab=1.4,cex.axis = 1.3)

NA
NA

plot fire size map QGIS

library(data.table)
DT= data.table(res)
fire_size = DT[ , .SD[which.min(growth_km)], by = firename]

fire_size = fire_size[,c()]
spread_list =list.files(viirs_dir, pattern = "_daily.shp$", recursive = TRUE, full.names=T)
i=1
 l=shapefile(spread_list[i])
for (i in 2:length(spread_list)){
  p=shapefile(spread_list[i])
  l <- rbind(l, p, makeUniqueIDs = TRUE) 
}
 l$human = 0
l$human[l$cause !=1 & l$cause !=14 & l$cause !=17]=1
l$human[l$cause ==1 ]=2

     writeOGR(l, "/Users/stijnhantson/Documents/projects/VIIRS_ros/", layer= "all_fires", driver="ESRI Shapefile", overwrite_layer = T)
extract number and size statistics from frap
library(raster)

dr =shapefile("/Users/stijnhantson/Documents/projects/VIIRS_ros/frap_subset.shp")
dr1 =shapefile("/Users/stijnhantson/Documents/data/FRAP/fire18_1.shp")
dr1$YEAR_=as.numeric(as.character(dr1$YEAR_))
dr1$Shape_Area=as.numeric(as.character(dr1$Shape_Area))
dr1=dr1[!is.na(dr1$YEAR_), ]
dr1=dr1[dr1$YEAR_>2011,]
sum(dr$Shape_Area)/sum(dr1$Shape_Area)
[1] 0.8759237
sum(na.omit(dr$GIS_ACRES))/sum(na.omit(dr1$GIS_ACRES))
[1] 0.8759592
dr$sqkm = dr$GIS_ACRES * 0.0040468564224
max(dr$sqkm)
[1] 1660.03
dr_h = dr[dr$CAUSE !=1 & dr$CAUSE !=14,]
dr_l = dr[dr$CAUSE == 1,]
print("mean fire size for human and lightning fires")
[1] "mean fire size for human and lightning fires"
mean(dr_h$GIS_ACRES)* 0.0040468564224
[1] 113.473
mean(dr_l$GIS_ACRES)* 0.0040468564224
[1] 84.11026
quantile(dr_h$GIS_ACRES)* 0.0040468564224
         0%         25%         50%         75%        100% 
   4.232025    8.345695   25.937887  120.236197 1140.367212 
quantile(dr_l$GIS_ACRES)* 0.0040468564224
         0%         25%         50%         75%        100% 
   4.049761   12.107347   34.898720   74.864795 1276.829740 
hist.a =hist(dr$sqkm,breaks =c(0,10,25,50,100,250,1000,2000),plot=F)

fr = barplot(hist.a$counts, beside=TRUE,xlab=expression('Fire size (km'^2*')'),ylab="Number of fires",cex.lab=1.4,cex.axis = 1.3)
axis(1,at=c(0.1,1.3,2.5,3.7,4.9,6.1,7.3,8.5),labels=c(0,10,25,50,100,250,1000,2000),cex.axis = 1.3)

pdf(file="/Users/stijnhantson/Documents/Documents/articulos/en_proceso/VIIRS_ros/Sx_pdf_firesize.pdf",width=7,height=6)
fr = barplot(hist.a$counts, beside=TRUE,xlab=expression('Fire size (km'^2*')'),ylab="Number of fires",cex.lab=1.4,cex.axis = 1.3)
axis(1,at=c(0.1,1.3,2.5,3.7,4.9,6.1,7.3,8.5),labels=c(0,10,25,50,100,250,1000,2000),cex.axis = 1.3)
dev.off()
quartz_off_screen 
                2 

  1. frap
  2. only fire growth datasets

daily_res=read.table("/Users/stijnhantson/Documents/projects/VIIRS_ros/final_dataset_V3.txt",header=T)

res=as.data.frame(daily_res)

res$mean_ros =as.numeric(as.character(res$mean_ros))
res$max_ros =as.numeric(as.character(res$max_ros))
res$median95_ros =as.numeric(as.character(res$median95_ros))
res$bi =as.numeric(as.character(res$bi))
res$erc =as.numeric(as.character(res$erc))
res$etr =as.numeric(as.character(res$etr))
res$fm100 =as.numeric(as.character(res$fm100))
res$fm1000 =as.numeric(as.character(res$fm1000))
res$pet =as.numeric(as.character(res$pet))
res$pr =as.numeric(as.character(res$pr))
res$rmax =as.numeric(as.character(res$rmax))
res$rmin =as.numeric(as.character(res$rmin))
res$th =as.numeric(as.character(res$th))
res$tmmn =as.numeric(as.character(res$tmmn))
res$tmmx =as.numeric(as.character(res$tmmx))
res$vpd =as.numeric(as.character(res$vpd))
#res$ws =as.numeric(as.character(res$ws))
res$vs =as.numeric(as.character(res$vs))
res$growth =as.numeric(as.character(res$growth))
res$total_area =as.numeric(as.character(res$total_area))
res$mean_frp =as.numeric(as.character(res$mean_frp))
res$frp_95 =as.numeric(as.character(res$frp_95))
res$max_land =as.numeric(as.character(res$max_land))
res$mean_land =as.numeric(as.character(res$mean_land))
res$biomass =as.numeric(as.character(res$biomass))
res$year =as.numeric(as.character(res$year))
res$month =as.numeric(as.character(res$month))
res$doy_out =as.numeric(as.character(res$doy_out))

res = res[-1,]
res$per_ba = res$growth/res$total_area
res$growth_km =res$growth/1000000

res$human = 0
res$human[res$cause !=1 & res$cause !=14 & res$cause !=17]=1
res$human[res$cause ==1 ]=2

res$ros_km = (res$median95_ros*24)/1000
res$ros_mean_km = (res$mean_ros*24)/1000

plot mean vs max fire rate-of-spread

#summary(res)
plot(res$ros_km,res$ros_mean_km, xlab="maximum fire-spread-rate (km/day",ylab="mean fire-spread-rate (km/day)")


tiff("/Users/stijnhantson/Documents/Documents/articulos/en_proceso/VIIRS_ros/mean_vs_max_ros_v1.tif", width = 5, height = 5, units = 'in', res = 300)
plot(res$ros_km,res$ros_mean_km, xlim=c(0,25),ylim=c(0,10), xlab="maximum fire rate-of-spread (km/day)",ylab="mean fire rate-of-spread (km/day)", cex.lab=1.3,cex.axis = 1.25)
dev.off()
quartz_off_screen 
                2 

difference between human and lightnign fires

me=0
me1=0
days = c("day1","day2","day3","day4","day5")
days1 = c("1","2","3","4","5")
pro1 = res[res$fire_day == 1 & res$human == 1,]
pro2 = res[res$fire_day == 2 & res$human == 1,]
pro3 = res[res$fire_day == 3 & res$human == 1,]
pro4 = res[res$fire_day == 4 & res$human == 1,]
pro5 = res[res$fire_day == 5 & res$human == 1,]
me[1] =mean(pro1$growth_km,na.omit=T)
me[2] =mean(pro2$growth_km,na.omit=T)
me[3] =mean(pro3$growth_km,na.omit=T)
me[4] =mean(pro4$growth_km,na.omit=T)
me[5] =mean(pro5$growth_km,na.omit=T)

pro1h = res[res$fire_day == 1 & res$human == 2,]
pro2h = res[res$fire_day == 2 & res$human == 2,]
pro3h = res[res$fire_day == 3 & res$human == 2,]
pro4h = res[res$fire_day == 4 & res$human == 2,]
pro5h = res[res$fire_day == 5 & res$human == 2,]
me1[1] =mean(pro1h$growth_km,na.omit=T)
me1[2] =mean(pro2h$growth_km,na.omit=T)
me1[3] =mean(pro3h$growth_km,na.omit=T)
me1[4] =mean(pro4h$growth_km,na.omit=T)
me1[5] =mean(pro5h$growth_km,na.omit=T)

boxplot(pro1$growth_km,pro2$growth_km,pro3$growth_km,pro4$growth_km,pro5$growth_km,names=c("day1","day2","day3","day4","day5"),xlab="",ylab="fire size (km2)",ylim=c(0,250), cex.lab=1.4,cex.axis = 1.3)


boxplot(pro1h$growth_km,pro2h$growth_km,pro3h$growth_km,pro4h$growth_km,pro5h$growth_km,names=c("day1","day2","day3","day4","day5"),xlab="",ylab="fire size (km2)",ylim=c(0,250), cex.lab=1.4,cex.axis = 1.3)

tiff("/Users/stijnhantson/Documents/Documents/articulos/en_proceso/VIIRS_ros/figure1_v1.tif", width = 10, height = 5, units = 'in', res = 300)
par(mfrow=c(1,2))
par(mar=c(4, 4, 1,0.1))
par(mgp=c(2.3,1,0))
boxplot(pro1$growth_km,pro2$growth_km,pro3$growth_km,pro4$growth_km,pro5$growth_km,names=c("1","2","3","4","5"),xlab="Day since fire start",ylab= expression('Fire size (km'^-1*')'),ylim=c(0,200), cex.lab=1.4,cex.axis = 1.3)
boxplot(pro1h$growth_km,pro2h$growth_km,pro3h$growth_km,pro4h$growth_km,pro5h$growth_km,names=c("1","2","3","4","5"),xlab="Day since fire start",ylab= "",ylim=c(0,200), cex.lab=1.4,cex.axis = 1.3)
dev.off()
quartz_off_screen 
                2 
tiff("/Users/stijnhantson/Documents/Documents/articulos/en_proceso/VIIRS_ros/sup_figure1_v1.tif", width = 10, height = 5, units = 'in', res = 300)
par(mfrow=c(1,2))
par(mar=c(4, 4, 1,0.1))
par(mgp=c(2.3,1,0))
boxplot(pro1$growth_km,pro2$growth_km,pro3$growth_km,pro4$growth_km,pro5$growth_km,names=c("1","2","3","4","5"),xlab="Day since fire start",ylab= expression('Fire size (km'^-1*')'),ylim=c(0,700), cex.lab=1.4,cex.axis = 1.3)
boxplot(pro1h$growth_km,pro2h$growth_km,pro3h$growth_km,pro4h$growth_km,pro5h$growth_km,names=c("1","2","3","4","5"),xlab="Day since fire start",ylab= "",ylim=c(0,700), cex.lab=1.4,cex.axis = 1.3)
dev.off() 
quartz_off_screen 
                2 
pdf("/Users/stijnhantson/Documents/Documents/articulos/en_proceso/VIIRS_ros/sup_fig4/all.pdf", width = 4, height = 5)
par(mgp=c(2.3,1,0))  
plot(me,type="o", ylim=c(0,150),ylab=expression("fire size (km"^2*")"),xlab="", xaxt='n', lty = 1, lwd = 2,cex.lab=1.2)
axis(side=1, at=c(1:5),labels=days1)
points(me1,type="o",lty = 2, lwd = 2)
dev.off() 
quartz_off_screen 
                2 

t.test(log(pro1$growth_km),log(pro1h$growth_km))

    Welch Two Sample t-test

data:  log(pro1$growth_km) and log(pro1h$growth_km)
t = 6.5083, df = 169.36, p-value = 8.265e-10
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 1.492386 2.791866
sample estimates:
 mean of x  mean of y 
 1.3226886 -0.8194377 
t.test(log(pro2$growth_km),log(pro2h$growth_km))

    Welch Two Sample t-test

data:  log(pro2$growth_km) and log(pro2h$growth_km)
t = 6.9843, df = 134.4, p-value = 1.199e-10
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 1.369607 2.451706
sample estimates:
mean of x mean of y 
2.7559564 0.8453003 
t.test(log(pro3$growth_km),log(pro3h$growth_km))

    Welch Two Sample t-test

data:  log(pro3$growth_km) and log(pro3h$growth_km)
t = 5.3694, df = 137.17, p-value = 3.286e-07
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 0.9293526 2.0129234
sample estimates:
mean of x mean of y 
 3.186372  1.715234 
t.test(log(pro4$growth_km),log(pro4h$growth_km))

    Welch Two Sample t-test

data:  log(pro4$growth_km) and log(pro4h$growth_km)
t = 4.6217, df = 122.92, p-value = 9.467e-06
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 0.6909157 1.7261008
sample estimates:
mean of x mean of y 
 3.513204  2.304696 
t.test(log(pro5$growth_km),log(pro5h$growth_km))

    Welch Two Sample t-test

data:  log(pro5$growth_km) and log(pro5h$growth_km)
t = 4.9328, df = 103.98, p-value = 3.089e-06
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 0.9170094 2.1499736
sample estimates:
mean of x mean of y 
 3.895266  2.361774 

##################3 for western cordillera ecoregion ##################

me=0
me1=0
pro1 = res[res$fire_day == 1 & res$human == 1 & (res$eco1 == 6 | res$eco1 == 7),]
pro2 = res[res$fire_day == 2 & res$human == 1 & (res$eco1 == 6 | res$eco1 == 7),]
pro3 = res[res$fire_day == 3 & res$human == 1 & (res$eco1 == 6 | res$eco1 == 7),]
pro4 = res[res$fire_day == 4 & res$human == 1 & (res$eco1 == 6 | res$eco1 == 7),]
pro5 = res[res$fire_day == 5 & res$human == 1 & (res$eco1 == 6 | res$eco1 == 7),]

boxplot(pro1$growth_km,pro2$growth_km,pro3$growth_km,pro4$growth_km,pro5$growth_km,names=c("day1","day2","day3","day4","day5"),xlab="",ylab="fire size (km2)",ylim=c(0,250), cex.lab=1.4,cex.axis = 1.3)


pro1h = res[res$fire_day == 1 & res$human == 2 & (res$eco1 == 6 | res$eco1 == 7),]
pro2h = res[res$fire_day == 2 & res$human == 2 & (res$eco1 == 6 | res$eco1 == 7),]
pro3h = res[res$fire_day == 3 & res$human == 2 & (res$eco1 == 6 | res$eco1 == 7),]
pro4h = res[res$fire_day == 4 & res$human == 2 & (res$eco1 == 6 | res$eco1 == 7),]
pro5h = res[res$fire_day == 5 & res$human == 2 & (res$eco1 == 6 | res$eco1 == 7),]

boxplot(pro1h$growth_km,pro2h$growth_km,pro3h$growth_km,pro4h$growth_km,pro5h$growth_km,names=c("day1","day2","day3","day4","day5"),xlab="",ylab="fire size (km2)",ylim=c(0,250), cex.lab=1.4,cex.axis = 1.3)

me[1] =mean(pro1$growth_km,na.omit=T)
me[2] =mean(pro2$growth_km,na.omit=T)
me[3] =mean(pro3$growth_km,na.omit=T)
me[4] =mean(pro4$growth_km,na.omit=T)
me[5] =mean(pro5$growth_km,na.omit=T)

me1[1] =mean(pro1h$growth_km,na.rm=T)
me1[2] =mean(pro2h$growth_km,na.rm=T)
me1[3] =mean(pro3h$growth_km,na.rm=T)
me1[4] =mean(pro4h$growth_km,na.rm=T)
me1[5] =mean(pro5h$growth_km,na.rm=T)


par(mgp=c(2.3,1,0))  

plot(me,type="o", ylim=c(0,150),ylab=expression("fire size (km"^2*")"),xlab="", xaxt='n', lty = 1, lwd = 2,cex.lab=1.2)
axis(side=1, at=c(1:5),labels=days)
points(me1,type="o",lty = 2, lwd = 2)

pdf("/Users/stijnhantson/Documents/Documents/articulos/en_proceso/VIIRS_ros/sup_fig4/north.pdf", width = 4, height = 5)
par(mgp=c(2.3,1,0))  
plot(me,type="o", ylim=c(0,150),ylab=expression("fire size (km"^2*")"),xlab="", xaxt='n', lty = 1, lwd = 2,cex.lab=1.2)
axis(side=1, at=c(1:5),labels=days1)
points(me1,type="o",lty = 2, lwd = 2)
dev.off() 
quartz_off_screen 
                2 

t.test(log(pro1$growth_km),log(pro1h$growth_km))

    Welch Two Sample t-test

data:  log(pro1$growth_km) and log(pro1h$growth_km)
t = 3.2086, df = 69.426, p-value = 0.002019
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 0.5363985 2.2992588
sample estimates:
 mean of x  mean of y 
 0.4219047 -0.9959240 
t.test(log(pro2$growth_km),log(pro2h$growth_km))

    Welch Two Sample t-test

data:  log(pro2$growth_km) and log(pro2h$growth_km)
t = 4.9267, df = 97.316, p-value = 3.427e-06
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 0.9938201 2.3346153
sample estimates:
mean of x mean of y 
 2.303104  0.638886 
t.test(log(pro3$growth_km),log(pro3h$growth_km))

    Welch Two Sample t-test

data:  log(pro3$growth_km) and log(pro3h$growth_km)
t = 3.4468, df = 82.843, p-value = 0.0008936
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 0.4842092 1.8055445
sample estimates:
mean of x mean of y 
 2.695279  1.550402 
t.test(log(pro4$growth_km),log(pro4h$growth_km))

    Welch Two Sample t-test

data:  log(pro4$growth_km) and log(pro4h$growth_km)
t = 3.019, df = 73.938, p-value = 0.003479
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 0.3104149 1.5156656
sample estimates:
mean of x mean of y 
 3.092997  2.179957 
t.test(log(pro5$growth_km),log(pro5h$growth_km))

    Welch Two Sample t-test

data:  log(pro5$growth_km) and log(pro5h$growth_km)
t = 3.1504, df = 55.57, p-value = 0.002625
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 0.4138127 1.8597722
sample estimates:
mean of x mean of y 
 3.402659  2.265867 
mean(pro1$growth_km,na.omit=T)
[1] 16.60532
mean(pro1h$growth_km,na.rm=T)
[1] 2.714784

for mediteranean california

pro1 = res[res$fire_day == 1 & res$human == 1 & (res$eco1 == 11),]
pro2 = res[res$fire_day == 2 & res$human == 1 & (res$eco1 == 11),]
pro3 = res[res$fire_day == 3 & res$human == 1 & (res$eco1 == 11),]
pro4 = res[res$fire_day == 4 & res$human == 1 & (res$eco1 == 11),]
pro5 = res[res$fire_day == 5 & res$human == 1 & (res$eco1 == 11),]

boxplot(pro1$growth_km,pro2$growth_km,pro3$growth_km,pro4$growth_km,pro5$growth_km,names=c("day1","day2","day3","day4","day5"),xlab="",ylab="fire size (km2)",ylim=c(0,300), cex.lab=1.4,cex.axis = 1.3)


pro1h = res[res$fire_day == 1 & res$human == 2 & (res$eco1 == 11),]
pro2h = res[res$fire_day == 2 & res$human == 2 & (res$eco1 == 11),]
pro3h = res[res$fire_day == 3 & res$human == 2 & (res$eco1 == 11),]
pro4h = res[res$fire_day == 4 & res$human == 2 & (res$eco1 == 11),]
pro5h = res[res$fire_day == 5 & res$human == 2 & (res$eco1 == 11),]

boxplot(pro1h$growth_km,pro2h$growth_km,pro3h$growth_km,pro4h$growth_km,pro5h$growth_km,names=c("day1","day2","day3","day4","day5"),xlab="",ylab="fire size (km2)",ylim=c(0,300), cex.lab=1.4,cex.axis = 1.3)

me[1] =mean(pro1$growth_km,na.omit=T)
me[2] =mean(pro2$growth_km,na.omit=T)
me[3] =mean(pro3$growth_km,na.omit=T)
me[4] =mean(pro4$growth_km,na.omit=T)
me[5] =mean(pro5$growth_km,na.omit=T)

me1[1] =mean(pro1h$growth_km,na.rm=T)
me1[2] =mean(pro2h$growth_km,na.rm=T)
me1[3] =mean(pro3h$growth_km,na.rm=T)
me1[4] =mean(pro4h$growth_km,na.rm=T)
me1[5] =mean(pro5h$growth_km,na.rm=T)


par(mgp=c(2.3,1,0))  

plot(me,type="o", ylim=c(0,150),ylab=expression("fire size (km"^2*")"),xlab="", xaxt='n', lty = 1, lwd = 2,cex.lab=1.2)
axis(side=1, at=c(1:5),labels=days)
points(me1,type="o",lty = 2, lwd = 2)

pdf("/Users/stijnhantson/Documents/Documents/articulos/en_proceso/VIIRS_ros/sup_fig4/med.pdf", width = 4, height = 5)
par(mgp=c(2.3,1,0))  
plot(me,type="o", ylim=c(0,150),ylab=expression("fire size (km"^2*")"),xlab="", xaxt='n', lty = 1, lwd = 2,cex.lab=1.2)
axis(side=1, at=c(1:5),labels=days1)
points(me1,type="o",lty = 2, lwd = 2)
dev.off() 
quartz_off_screen 
                2 

for difference in autumn

pro1 = res[res$fire_day == 1 & res$human == 1 & res$month >8,]
pro2 = res[res$fire_day == 2 & res$human == 1 & res$month >8,]
pro3 = res[res$fire_day == 3 & res$human == 1 & res$month >8,]
pro4 = res[res$fire_day == 4 & res$human == 1 & res$month >8,]
pro5 = res[res$fire_day == 5 & res$human == 1 & res$month >8,]

boxplot(pro1$growth_km,pro2$growth_km,pro3$growth_km,pro4$growth_km,pro5$growth_km,names=c("day1","day2","day3","day4","day5"),xlab="",ylab="fire size (km2)",ylim=c(0,300), cex.lab=1.4,cex.axis = 1.3)


pro1h = res[res$fire_day == 1 & res$human == 2 & res$month >8,]
pro2h = res[res$fire_day == 2 & res$human == 2 & res$month >8,]
pro3h = res[res$fire_day == 3 & res$human == 2 & res$month >8,]
pro4h = res[res$fire_day == 4 & res$human == 2 & res$month >8,]
pro5h = res[res$fire_day == 5 & res$human == 2 & res$month >8,]

boxplot(pro1h$growth_km,pro2h$growth_km,pro3h$growth_km,pro4h$growth_km,pro5h$growth_km,names=c("day1","day2","day3","day4","day5"),xlab="",ylab="fire size (km2)",ylim=c(0,300), cex.lab=1.4,cex.axis = 1.3)

me[1] =mean(pro1$growth_km,na.omit=T)
me[2] =mean(pro2$growth_km,na.omit=T)
me[3] =mean(pro3$growth_km,na.omit=T)
me[4] =mean(pro4$growth_km,na.omit=T)
me[5] =mean(pro5$growth_km,na.omit=T)

me1[1] =mean(pro1h$growth_km,na.rm=T)
me1[2] =mean(pro2h$growth_km,na.rm=T)
me1[3] =mean(pro3h$growth_km,na.rm=T)
me1[4] =mean(pro4h$growth_km,na.rm=T)
me1[5] =mean(pro5h$growth_km,na.rm=T)


par(mgp=c(2.3,1,0))  

plot(me,type="o", ylim=c(0,150),ylab=expression("fire size (km"^2*")"),xlab="", xaxt='n', lty = 1, lwd = 2,cex.lab=1.2)
axis(side=1, at=c(1:5),labels=days)
points(me1,type="o",lty = 2, lwd = 2)

pdf("/Users/stijnhantson/Documents/Documents/articulos/en_proceso/VIIRS_ros/sup_fig4/autumn.pdf", width = 4, height = 5)
par(mgp=c(2.3,1,0))  
plot(me,type="o", ylim=c(0,250),ylab=expression("fire size (km"^2*")"),xlab="", xaxt='n', lty = 1, lwd = 2,cex.lab=1.2)
axis(side=1, at=c(1:5),labels=days1)
points(me1,type="o",lty = 2, lwd = 2)
dev.off() 
quartz_off_screen 
                2 

for difference in summer

pro1 = res[res$fire_day == 1 & res$human == 1 & res$month <=8 ,]
pro2 = res[res$fire_day == 2 & res$human == 1 & res$month <=8,]
pro3 = res[res$fire_day == 3 & res$human == 1 & res$month <=8,]
pro4 = res[res$fire_day == 4 & res$human == 1 & res$month <=8,]
pro5 = res[res$fire_day == 5 & res$human == 1 & res$month <=8,]

boxplot(pro1$growth_km,pro2$growth_km,pro3$growth_km,pro4$growth_km,pro5$growth_km,names=c("day1","day2","day3","day4","day5"),xlab="",ylab="fire size (km2)",ylim=c(0,300), cex.lab=1.4,cex.axis = 1.3)


pro1h = res[res$fire_day == 1 & res$human == 2 & res$month <=8,]
pro2h = res[res$fire_day == 2 & res$human == 2 & res$month <=8,]
pro3h = res[res$fire_day == 3 & res$human == 2 & res$month <=8,]
pro4h = res[res$fire_day == 4 & res$human == 2 & res$month <=8,]
pro5h = res[res$fire_day == 5 & res$human == 2 & res$month <=8,]

boxplot(pro1h$growth_km,pro2h$growth_km,pro3h$growth_km,pro4h$growth_km,pro5h$growth_km,names=c("day1","day2","day3","day4","day5"),xlab="",ylab="fire size (km2)",ylim=c(0,300), cex.lab=1.4,cex.axis = 1.3)

me[1] =mean(pro1$growth_km,na.omit=T)
me[2] =mean(pro2$growth_km,na.omit=T)
me[3] =mean(pro3$growth_km,na.omit=T)
me[4] =mean(pro4$growth_km,na.omit=T)
me[5] =mean(pro5$growth_km,na.omit=T)

me1[1] =mean(pro1h$growth_km,na.rm=T)
me1[2] =mean(pro2h$growth_km,na.rm=T)
me1[3] =mean(pro3h$growth_km,na.rm=T)
me1[4] =mean(pro4h$growth_km,na.rm=T)
me1[5] =mean(pro5h$growth_km,na.rm=T)


par(mgp=c(2.3,1,0))  

plot(me,type="o", ylim=c(0,150),ylab=expression("fire size (km"^2*")"),xlab="", xaxt='n', lty = 1, lwd = 2,cex.lab=1.2)
axis(side=1, at=c(1:5),labels=days)
points(me1,type="o",lty = 2, lwd = 2)

pdf("/Users/stijnhantson/Documents/Documents/articulos/en_proceso/VIIRS_ros/sup_fig4/summer.pdf", width = 4, height = 5)
par(mgp=c(2.3,1,0))  
plot(me,type="o", ylim=c(0,150),ylab=expression("fire size (km"^2*")"),xlab="", xaxt='n', lty = 1, lwd = 2,cex.lab=1.2)
axis(side=1, at=c(1:5),labels=days1)
points(me1,type="o",lty = 2, lwd = 2)
dev.off() 
quartz_off_screen 
                2 

for difference in summer in western cordillera

pro1 = res[res$fire_day == 1 & res$human == 1 & ( res$month <=8 & res$month >5 ) & (res$eco1 == 6 | res$eco1 == 7),]
pro2 = res[res$fire_day == 2 & res$human == 1 & ( res$month <=8 & res$month >5 ) & (res$eco1 == 6 | res$eco1 == 7),]
pro3 = res[res$fire_day == 3 & res$human == 1 & ( res$month <=8 & res$month >5 ) & (res$eco1 == 6 | res$eco1 == 7),]
pro4 = res[res$fire_day == 4 & res$human == 1 & ( res$month <=8 & res$month >5 ) & (res$eco1 == 6 | res$eco1 == 7),]
pro5 = res[res$fire_day == 5 & res$human == 1 & ( res$month <=8 & res$month >5 ) & (res$eco1 == 6 | res$eco1 == 7),]

boxplot(pro1$growth_km,pro2$growth_km,pro3$growth_km,pro4$growth_km,pro5$growth_km,names=c("day1","day2","day3","day4","day5"),xlab="",ylab="fire size (km2)",ylim=c(0,300), cex.lab=1.4,cex.axis = 1.3)


pro1h = res[res$fire_day == 1 & res$human == 2 & ( res$month <=8 & res$month >5 ) & (res$eco1 == 6 | res$eco1 == 7),]
pro2h = res[res$fire_day == 2 & res$human == 2 & ( res$month <=8 & res$month >5 ) & (res$eco1 == 6 | res$eco1 == 7),]
pro3h = res[res$fire_day == 3 & res$human == 2 & ( res$month <=8 & res$month >5 ) & (res$eco1 == 6 | res$eco1 == 7),]
pro4h = res[res$fire_day == 4 & res$human == 2 & ( res$month <=8 & res$month >5 ) & (res$eco1 == 6 | res$eco1 == 7),]
pro5h = res[res$fire_day == 5 & res$human == 2 & ( res$month <=8 & res$month >5 ) & (res$eco1 == 6 | res$eco1 == 7),]

boxplot(pro1h$growth_km,pro2h$growth_km,pro3h$growth_km,pro4h$growth_km,pro5h$growth_km,names=c("day1","day2","day3","day4","day5"),xlab="",ylab="fire size (km2)",ylim=c(0,300), cex.lab=1.4,cex.axis = 1.3)

t.test(log(pro1$growth_km),log(pro1h$growth_km))

    Welch Two Sample t-test

data:  log(pro1$growth_km) and log(pro1h$growth_km)
t = 1.3062, df = 51.551, p-value = 0.1973
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -0.3236595  1.5299715
sample estimates:
 mean of x  mean of y 
-0.1773847 -0.7805406 
t.test(log(pro2$growth_km),log(pro2h$growth_km))

    Welch Two Sample t-test

data:  log(pro2$growth_km) and log(pro2h$growth_km)
t = 3.6535, df = 78.926, p-value = 0.0004639
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 0.5639969 1.9140943
sample estimates:
mean of x mean of y 
2.0787175 0.8396718 
t.test(log(pro3$growth_km),log(pro3h$growth_km))

    Welch Two Sample t-test

data:  log(pro3$growth_km) and log(pro3h$growth_km)
t = 2.1785, df = 57.055, p-value = 0.03352
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 0.05727942 1.36024900
sample estimates:
mean of x mean of y 
 2.551723  1.842958 
t.test(log(pro4$growth_km),log(pro4h$growth_km))

    Welch Two Sample t-test

data:  log(pro4$growth_km) and log(pro4h$growth_km)
t = 2.353, df = 57.21, p-value = 0.02208
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 0.1074894 1.3347908
sample estimates:
mean of x mean of y 
 2.992332  2.271192 
t.test(log(pro5$growth_km),log(pro5h$growth_km))

    Welch Two Sample t-test

data:  log(pro5$growth_km) and log(pro5h$growth_km)
t = 2.3446, df = 41.508, p-value = 0.02391
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 0.105315 1.410281
sample estimates:
mean of x mean of y 
 3.313679  2.555881 
me[1] =mean(pro1$growth_km,na.omit=T)
me[2] =mean(pro2$growth_km,na.omit=T)
me[3] =mean(pro3$growth_km,na.omit=T)
me[4] =mean(pro4$growth_km,na.omit=T)
me[5] =mean(pro5$growth_km,na.omit=T)

me1[1] =mean(pro1h$growth_km,na.rm=T)
me1[2] =mean(pro2h$growth_km,na.rm=T)
me1[3] =mean(pro3h$growth_km,na.rm=T)
me1[4] =mean(pro4h$growth_km,na.rm=T)
me1[5] =mean(pro5h$growth_km,na.rm=T)

par(mgp=c(2.3,1,0))  

plot(me,type="o", ylim=c(0,150),ylab=expression("fire size (km"^2*")"),xlab="", xaxt='n', lty = 1, lwd = 2,cex.lab=1.2)
axis(side=1, at=c(1:5),labels=days)
points(me1,type="o",lty = 2, lwd = 2)

pdf("/Users/stijnhantson/Documents/Documents/articulos/en_proceso/VIIRS_ros/sup_fig4/north_summer.pdf", width = 4, height = 5)
par(mgp=c(2.3,1,0))  
plot(me,type="o", ylim=c(0,150),ylab=expression("fire size (km"^2*")"),xlab="", xaxt='n', lty = 1, lwd = 2,cex.lab=1.2)
axis(side=1, at=c(1:5),labels=days1)
points(me1,type="o",lty = 2, lwd = 2)
dev.off() 
quartz_off_screen 
                2 

for difference in autumn in western cordillera

pro1 = res[res$fire_day == 1 & res$human == 1 & ( res$month >8 ) & (res$eco1 == 6 | res$eco1 == 7),]
pro2 = res[res$fire_day == 2 & res$human == 1 & ( res$month >8 ) & (res$eco1 == 6 | res$eco1 == 7),]
pro3 = res[res$fire_day == 3 & res$human == 1 & ( res$month >8 ) & (res$eco1 == 6 | res$eco1 == 7),]
pro4 = res[res$fire_day == 4 & res$human == 1 & ( res$month >8 ) & (res$eco1 == 6 | res$eco1 == 7),]
pro5 = res[res$fire_day == 5 & res$human == 1 & ( res$month >8 ) & (res$eco1 == 6 | res$eco1 == 7),]

boxplot(pro1$growth_km,pro2$growth_km,pro3$growth_km,pro4$growth_km,pro5$growth_km,names=c("day1","day2","day3","day4","day5"),xlab="",ylab="fire size (km2)",ylim=c(0,300), cex.lab=1.4,cex.axis = 1.3)


pro1h = res[res$fire_day == 1 & res$human == 2 & ( res$month >8 ) & (res$eco1 == 6 | res$eco1 == 7),]
pro2h = res[res$fire_day == 2 & res$human == 2 & ( res$month >8 ) & (res$eco1 == 6 | res$eco1 == 7),]
pro3h = res[res$fire_day == 3 & res$human == 2 & ( res$month >8 ) & (res$eco1 == 6 | res$eco1 == 7),]
pro4h = res[res$fire_day == 4 & res$human == 2 & (res$month >8 ) & (res$eco1 == 6 | res$eco1 == 7),]
pro5h = res[res$fire_day == 5 & res$human == 2 & ( res$month >8 ) & (res$eco1 == 6 | res$eco1 == 7),]

boxplot(pro1h$growth_km,pro2h$growth_km,pro3h$growth_km,pro4h$growth_km,pro5h$growth_km,names=c("day1","day2","day3","day4","day5"),xlab="",ylab="fire size (km2)",ylim=c(0,300), cex.lab=1.4,cex.axis = 1.3)

me[1] =mean(pro1$growth_km,na.omit=T)
me[2] =mean(pro2$growth_km,na.omit=T)
me[3] =mean(pro3$growth_km,na.omit=T)
me[4] =mean(pro4$growth_km,na.omit=T)
me[5] =mean(pro5$growth_km,na.omit=T)

me1[1] =mean(pro1h$growth_km,na.rm=T)
me1[2] =mean(pro2h$growth_km,na.rm=T)
me1[3] =mean(pro3h$growth_km,na.rm=T)
me1[4] =mean(pro4h$growth_km,na.rm=T)
me1[5] =mean(pro5h$growth_km,na.rm=T)

par(mgp=c(2.3,1,0))  

plot(me,type="o", ylim=c(0,150),ylab=expression("fire size (km"^2*")"),xlab="", xaxt='n', lty = 1, lwd = 2,cex.lab=1.2)
axis(side=1, at=c(1:5),labels=days)
points(me1,type="o",lty = 2, lwd = 2)

pdf("/Users/stijnhantson/Documents/Documents/articulos/en_proceso/VIIRS_ros/sup_fig4/north_autumn.pdf", width = 4, height = 5)
par(mgp=c(2.3,1,0))  
plot(me,type="o", ylim=c(0,250),ylab=expression("fire size (km"^2*")"),xlab="", xaxt='n', lty = 1, lwd = 2,cex.lab=1.2)
axis(side=1, at=c(1:5),labels=days1)
points(me1,type="o",lty = 2, lwd = 2)
dev.off() 
quartz_off_screen 
                2 

for difference in summer in meditereanean

pro1 = res[res$fire_day == 1 & res$human == 1 & ( res$month <=8 & res$month >5 ) & (res$eco1 == 11),]
pro2 = res[res$fire_day == 2 & res$human == 1 & ( res$month <=8 & res$month >5 ) & (res$eco1 == 11),]
pro3 = res[res$fire_day == 3 & res$human == 1 & ( res$month <=8 & res$month >5 ) & (res$eco1 == 11),]
pro4 = res[res$fire_day == 4 & res$human == 1 & ( res$month <=8 & res$month >5 ) & (res$eco1 == 11),]
pro5 = res[res$fire_day == 5 & res$human == 1 & ( res$month <=8 & res$month >5 ) & (res$eco1 == 11),]

boxplot(pro1$growth_km,pro2$growth_km,pro3$growth_km,pro4$growth_km,pro5$growth_km,names=c("day1","day2","day3","day4","day5"),xlab="",ylab="fire size (km2)",ylim=c(0,300), cex.lab=1.4,cex.axis = 1.3)


pro1h = res[res$fire_day == 1 & res$human == 2 & ( res$month <=8 & res$month >5 ) & (res$eco1 == 11),]
pro2h = res[res$fire_day == 2 & res$human == 2 & ( res$month <=8 & res$month >5 ) & (res$eco1 == 11),]
pro3h = res[res$fire_day == 3 & res$human == 2 & ( res$month <=8 & res$month >5 ) & (res$eco1 == 11),]
pro4h = res[res$fire_day == 4 & res$human == 2 & ( res$month <=8 & res$month >5 ) & (res$eco1 == 11),]
pro5h = res[res$fire_day == 5 & res$human == 2 & ( res$month <=8 & res$month >5 ) & (res$eco1 == 11),]

boxplot(pro1h$growth_km,pro2h$growth_km,pro3h$growth_km,pro4h$growth_km,pro5h$growth_km,names=c("day1","day2","day3","day4","day5"),xlab="",ylab="fire size (km2)",ylim=c(0,300), cex.lab=1.4,cex.axis = 1.3)

#t.test(log(pro1$growth_km),log(pro1h$growth_km))
#t.test(log(pro2$growth_km),log(pro2h$growth_km))
#t.test(log(pro3$growth_km),log(pro3h$growth_km))
#t.test(log(pro4$growth_km),log(pro4h$growth_km))
#t.test(log(pro5$growth_km),log(pro5h$growth_km))

me[1] =mean(pro1$growth_km,na.omit=T)
me[2] =mean(pro2$growth_km,na.omit=T)
me[3] =mean(pro3$growth_km,na.omit=T)
me[4] =mean(pro4$growth_km,na.omit=T)
me[5] =mean(pro5$growth_km,na.omit=T)

me1[1] =mean(pro1h$growth_km,na.rm=T)
me1[2] =mean(pro2h$growth_km,na.rm=T)
me1[3] =mean(pro3h$growth_km,na.rm=T)
me1[4] =mean(pro4h$growth_km,na.rm=T)
me1[5] =mean(pro5h$growth_km,na.rm=T)

par(mgp=c(2.3,1,0))  

plot(me,type="o", ylim=c(0,150),ylab=expression("fire size (km"^2*")"),xlab="", xaxt='n', lty = 1, lwd = 2,cex.lab=1.2)
axis(side=1, at=c(1:5),labels=days)
points(me1,type="o",lty = 2, lwd = 2)

pdf("/Users/stijnhantson/Documents/Documents/articulos/en_proceso/VIIRS_ros/sup_fig4/med_summer.pdf", width = 4, height = 5)
par(mgp=c(2.3,1,0))  
plot(me,type="o", ylim=c(0,150),ylab=expression("fire size (km"^2*")"),xlab="", xaxt='n', lty = 1, lwd = 2,cex.lab=1.2)
axis(side=1, at=c(1:5),labels=days1)
points(me1,type="o",lty = 2, lwd = 2)
dev.off() 
quartz_off_screen 
                2 

` ################## for difference in autumn in mediteranean ##################

pro1 = res[res$fire_day == 1 & res$human == 1 & ( res$month >8 ) & (res$eco1 == 11),]
pro2 = res[res$fire_day == 2 & res$human == 1 & ( res$month >8 ) & (res$eco1 == 11),]
pro3 = res[res$fire_day == 3 & res$human == 1 & ( res$month >8 ) & (res$eco1 == 11),]
pro4 = res[res$fire_day == 4 & res$human == 1 & ( res$month >8 ) & (res$eco1 == 11),]
pro5 = res[res$fire_day == 5 & res$human == 1 & ( res$month >8 ) & (res$eco1 == 11),]

boxplot(pro1$growth_km,pro2$growth_km,pro3$growth_km,pro4$growth_km,pro5$growth_km,names=c("day1","day2","day3","day4","day5"),xlab="",ylab="fire size (km2)",ylim=c(0,300), cex.lab=1.4,cex.axis = 1.3)


pro1h = res[res$fire_day == 1 & res$human == 2 & ( res$month >8 ) & (res$eco1 == 11),]
pro2h = res[res$fire_day == 2 & res$human == 2 & ( res$month >8 ) & (res$eco1 == 11),]
pro3h = res[res$fire_day == 3 & res$human == 2 & ( res$month >8 ) & (res$eco1 == 11),]
pro4h = res[res$fire_day == 4 & res$human == 2 & ( res$month >8 ) & (res$eco1 == 11),]
pro5h = res[res$fire_day == 5 & res$human == 2 & ( res$month >8 ) & (res$eco1 == 11),]

boxplot(pro1h$growth_km,pro2h$growth_km,pro3h$growth_km,pro4h$growth_km,pro5h$growth_km,names=c("day1","day2","day3","day4","day5"),xlab="",ylab="fire size (km2)",ylim=c(0,300), cex.lab=1.4,cex.axis = 1.3)

me[1] =mean(pro1$growth_km,na.omit=T)
me[2] =mean(pro2$growth_km,na.omit=T)
me[3] =mean(pro3$growth_km,na.omit=T)
me[4] =mean(pro4$growth_km,na.omit=T)
me[5] =mean(pro5$growth_km,na.omit=T)

me1[1] =mean(pro1h$growth_km,na.rm=T)
me1[2] =mean(pro2h$growth_km,na.rm=T)
me1[3] =mean(pro3h$growth_km,na.rm=T)
me1[4] =mean(pro4h$growth_km,na.rm=T)
me1[5] =mean(pro5h$growth_km,na.rm=T)

par(mgp=c(2.3,1,0))  

plot(me,type="o", ylim=c(0,150),ylab=expression("fire size (km"^2*")"),xlab="", xaxt='n', lty = 1, lwd = 2,cex.lab=1.2)
axis(side=1, at=c(1:5),labels=days)
points(me1,type="o",lty = 2, lwd = 2)

pdf("/Users/stijnhantson/Documents/Documents/articulos/en_proceso/VIIRS_ros/sup_fig4/med_autumn.pdf", width = 4, height = 5)
par(mgp=c(2.3,1,0))  
plot(me,type="o", ylim=c(0,400),ylab=expression("fire size (km"^2*")"),xlab="", xaxt='n', lty = 1, lwd = 2,cex.lab=1.2)
axis(side=1, at=c(1:5),labels=days1)
points(me1,type="o",lty = 2, lwd = 2)
dev.off() 
quartz_off_screen 
                2 

how many days does it take to reach 75% burnt area


peak_day1 = as.data.frame(aggregate(out1$total_area, by = list(out1$firename), max))
peak_day2 = as.data.frame(aggregate(out2$total_area, by = list(out2$firename), max))
mean(peak_day1$x)
[1] 86018999
mean(peak_day2$x)
[1] 129869921

res=res[res$ros_km>0,]
res_f = res[res$max_land == 1,]
res_p = res[res$max_land != 1,]

#just show the plot here
plot(res_f$mean_frp~res_f$ros_km,log="xy",xlim=c(0.005,30),ylim=c(0.1,180),xaxt="n",ylab="mean FRP (MW)",xlab="Rate-of-Spread (km/day)", cex.lab=1.4,cex.axis = 1.3,col="darkgreen")

marks=c(0.01,0.1,1,10)
marks1=c(0.1,0.5,5,50)
tiff("/Users/stijnhantson/Documents/Documents/articulos/en_proceso/VIIRS_ros/fig_FRP_ros_v3.tif", width = 5, height = 5, units = 'in', res = 300)
plot(res_f$mean_frp~res_f$ros_km,log="xy",xlim=c(0.005,30),ylim=c(0.1,180),xaxt="n",yaxt="n",ylab="mean FRP (MW)",xlab="Rate-of-Spread (km/day)", cex.lab=1.4,cex.axis = 1.3,col="darkgreen")
points(res_p$mean_frp~res_p$ros_km,col="orange")
axis(1,at=marks,labels=marks,cex.axis=1.4 )
axis(2,at=marks1,labels=marks1,cex.axis=1.4 )
legend( x="topleft",legend=c("Forest","Grass & shrub"),col=c("darkgreen","orange"),cex=1.2,pch=1,bty = "n")
dev.off()
quartz_off_screen 
                2 

difference in fire size for first 5 days across california and both ecosystems

 
res$ros1 = res$max_ros+1


out1 = subset(res,cause == 1 )   #1=lightning; 14=unknown; 7=arson
out2 = subset(res,cause !=1 & cause != 14 )

hum1 = out2[out2$fire_day ==1,]
hum2 = out2[out2$fire_day ==2,]
hum3 = out2[out2$fire_day ==3,]
hum4 = out2[out2$fire_day ==4,]
hum5 = out2[out2$fire_day ==5,]
lig1 = out1[out1$fire_day ==1,]
lig2 = out1[out1$fire_day ==2,]
lig3 = out1[out1$fire_day ==3,]
lig4 = out1[out1$fire_day ==4,]
lig5 = out1[out1$fire_day ==5,]
mean(hum1$growth)
[1] 18753898
mean(hum2$growth)
[1] 36707455
mean(hum3$growth)
[1] 57176147
mean(hum4$growth)
[1] 80694648
mean(hum5$growth)
[1] 115079142
mean(lig1$growth)
[1] 2875395
mean(lig2$growth)
[1] 10065897
mean(lig3$growth)
[1] 18876394
mean(lig4$growth)
[1] 28689523
mean(lig5$growth)
[1] 37533565
t.test(log10(hum1$growth),log10(lig1$growth))

    Welch Two Sample t-test

data:  log10(hum1$growth) and log10(lig1$growth)
t = 6.5083, df = 169.36, p-value = 8.265e-10
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 0.6481351 1.2124922
sample estimates:
mean of x mean of y 
 6.574436  5.644123 
t.test(log10(hum2$growth),log10(lig2$growth))

    Welch Two Sample t-test

data:  log10(hum2$growth) and log10(lig2$growth)
t = 6.9843, df = 134.4, p-value = 1.199e-10
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 0.5948126 1.0647622
sample estimates:
mean of x mean of y 
 7.196897  6.367109 
t.test(log10(hum3$growth),log10(lig3$growth))

    Welch Two Sample t-test

data:  log10(hum3$growth) and log10(lig3$growth)
t = 5.3694, df = 137.17, p-value = 3.286e-07
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 0.4036127 0.8742015
sample estimates:
mean of x mean of y 
 7.383824  6.744917 
t.test(log10(hum4$growth),log10(lig4$growth))

    Welch Two Sample t-test

data:  log10(hum4$growth) and log10(lig4$growth)
t = 4.6217, df = 122.92, p-value = 9.467e-06
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 0.3000609 0.7496361
sample estimates:
mean of x mean of y 
 7.525765  7.000917 
t.test(log10(hum5$growth),log10(lig5$growth))

    Welch Two Sample t-test

data:  log10(hum5$growth) and log10(lig5$growth)
t = 4.9328, df = 103.98, p-value = 3.089e-06
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 0.3982521 0.9337217
sample estimates:
mean of x mean of y 
 7.691692  7.025706 
hum1 = out2[out2$fire_day ==1 & out2$eco1==6,]
hum2 = out2[out2$fire_day ==2 & out2$eco1==6,]
hum3 = out2[out2$fire_day ==3 & out2$eco1==6,]
hum4 = out2[out2$fire_day ==4 & out2$eco1==6,]
hum5 = out2[out2$fire_day ==5 & out2$eco1==6,]
lig1 = out1[out1$fire_day ==1 & out1$eco1==6,]
lig2 = out1[out1$fire_day ==2 & out1$eco1==6,]
lig3 = out1[out1$fire_day ==3 & out1$eco1==6,]
lig4 = out1[out1$fire_day ==4 & out1$eco1==6,]
lig5 = out1[out1$fire_day ==5 & out1$eco1==6,]
mean(hum1$growth)
[1] 16605316
mean(hum2$growth)
[1] 30366275
mean(hum3$growth)
[1] 44666667
mean(hum4$growth)
[1] 63374279
mean(hum5$growth)
[1] 85629090
mean(lig1$growth, na.rm=T)
[1] 2747161
mean(lig2$growth, na.rm=T)
[1] 8686182
mean(lig3$growth, na.rm=T)
[1] 15363041
mean(lig4$growth, na.rm=T)
[1] 21997987
mean(lig5$growth, na.rm=T)
[1] 26941885
t.test(log10(hum1$growth),log10(lig1$growth))

    Welch Two Sample t-test

data:  log10(hum1$growth) and log10(lig1$growth)
t = 3.1605, df = 69.967, p-value = 0.002328
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 0.2244363 0.9921939
sample estimates:
mean of x mean of y 
 6.183231  5.574916 
t.test(log10(hum2$growth),log10(lig2$growth))

    Welch Two Sample t-test

data:  log10(hum2$growth) and log10(lig2$growth)
t = 4.8606, df = 97.58, p-value = 4.473e-06
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 0.4247076 1.0108416
sample estimates:
mean of x mean of y 
 7.000225  6.282451 
t.test(log10(hum3$growth),log10(lig3$growth))

    Welch Two Sample t-test

data:  log10(hum3$growth) and log10(lig3$growth)
t = 3.4215, df = 83.534, p-value = 0.0009662
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 0.2080219 0.7855227
sample estimates:
mean of x mean of y 
 7.170545  6.673773 
t.test(log10(hum4$growth),log10(lig4$growth))

    Welch Two Sample t-test

data:  log10(hum4$growth) and log10(lig4$growth)
t = 2.9997, df = 74.706, p-value = 0.00367
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 0.1331595 0.6597929
sample estimates:
mean of x mean of y 
 7.343272  6.946796 
t.test(log10(hum5$growth),log10(lig5$growth))

    Welch Two Sample t-test

data:  log10(hum5$growth) and log10(lig5$growth)
t = 3.1455, df = 56.335, p-value = 0.002647
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 0.1801401 0.8117505
sample estimates:
mean of x mean of y 
 7.477756  6.981811 
hum1 = out2[out2$fire_day ==1 & out2$eco1==11,]
hum2 = out2[out2$fire_day ==2 & out2$eco1==11,]
hum3 = out2[out2$fire_day ==3 & out2$eco1==11,]
hum4 = out2[out2$fire_day ==4 & out2$eco1==11,]
hum5 = out2[out2$fire_day ==5 & out2$eco1==11,]
lig1 = out1[out1$fire_day ==1 & out1$eco1==11,]
lig2 = out1[out1$fire_day ==2 & out1$eco1==11,]
lig3 = out1[out1$fire_day ==3 & out1$eco1==11,]
lig4 = out1[out1$fire_day ==4 & out1$eco1==11,]
lig5 = out1[out1$fire_day ==5 & out1$eco1==11,]
mean(hum1$growth)
[1] 21604386
mean(hum2$growth)
[1] 43011405
mean(hum3$growth)
[1] 71836206
mean(hum4$growth)
[1] 110978456
mean(hum5$growth)
[1] 156565228
mean(lig1$growth, na.rm=T)
[1] 12710105
mean(lig2$growth, na.rm=T)
[1] 24454241
mean(lig3$growth, na.rm=T)
[1] 39894008
mean(lig4$growth, na.rm=T)
[1] NaN
mean(lig5$growth, na.rm=T)
[1] NaN
#t.test(log10(hum1$growth),log10(lig1$growth))
#t.test(log10(hum2$growth),log10(lig2$growth))
t.test(log10(hum3$growth),log10(lig3$growth))
Error in t.test.default(log10(hum3$growth), log10(lig3$growth)) : 
  not enough 'y' observations

out1 = subset(res,cause == 1 )   #1=lightning; 14=unknown; 7=arson
out2 = subset(res,cause !=1 & cause != 14 )

mean(out1$ros_km,na.rm=T)
[1] 0.8405408
mean(out2$ros_km,na.rm=T)
[1] 1.82709
hist.a =hist(out1$ros_km,breaks =c(0,0.01,0.05,0.1,0.25,0.5,1,2,5,10,20,30),plot=F)
hist.b =hist(out2$ros_km,breaks =c(0,0.01,0.05,0.1,0.25,0.5,1,2,5,10,20,30),plot=F)
fg = rbind(hist.a$counts,hist.b$counts)

fr = barplot(fg, beside=TRUE,xlab="Rate-of-Spread (km/day)",ylab="Number of fire days",cex.lab=1.4,cex.axis = 1.3)
axis(1,at=c(0.5,3.5,6.5,9.5,12.5,15.5,18.5,21.5,24.5,27.5,30.5,33.5),labels=hist.a$breaks,cex.axis = 1.3)
legend("topright",legend = c("human","lightning"), fill=c("grey","black"),cex=1.4,bty = "n")


out1 = subset(res,cause == 1 & (eco1 == 6 | eco1 == 7))   #1=lightning; 14=unknown; 7=arson
out2 = subset(res,cause !=1 & cause != 14 & (eco1 == 6 | eco1 == 7))

hist.a =hist(out1$ros_km,breaks =c(0,0.01,0.05,0.1,0.25,0.5,1,2,5,10,20,30),plot=F)
hist.b =hist(out2$ros_km,breaks =c(0,0.01,0.05,0.1,0.25,0.5,1,2,5,10,20,30),plot=F)
fg = rbind(hist.a$counts,hist.b$counts)

fr = barplot(fg, beside=TRUE,xlab="Rate-of-Spread (km/day)",ylab="Number of fire days",cex.lab=1.4,cex.axis = 1.3)
axis(1,at=c(0.5,3.5,6.5,9.5,12.5,15.5,18.5,21.5,24.5,27.5,30.5,33.5),labels=hist.a$breaks,cex.axis = 1.3)
legend("topright",legend = c("human","lightning"), fill=c("grey","black"),cex=1.4,bty = "n")


out1 = subset(res,cause == 1 & eco1 == 11)   #1=lightning; 14=unknown; 7=arson
out2 = subset(res,cause !=1 & cause != 14 & eco1 == 11)

hist.a =hist(out1$ros_km,breaks =c(0,0.01,0.05,0.1,0.25,0.5,1,2,5,10,20,30),plot=F)
hist.b =hist(out2$ros_km,breaks =c(0,0.01,0.05,0.1,0.25,0.5,1,2,5,10,20,30),plot=F)
fg = rbind(hist.a$counts,hist.b$counts)

fr = barplot(fg, beside=TRUE,xlab="Rate-of-Spread (km/day)",ylab="Number of fire days",cex.lab=1.4,cex.axis = 1.3)
axis(1,at=c(0.5,3.5,6.5,9.5,12.5,15.5,18.5,21.5,24.5,27.5,30.5,33.5),labels=hist.a$breaks,cex.axis = 1.3)
legend("topright",legend = c("human","lightning"), fill=c("grey","black"),cex=1.4,bty = "n")


############ autumn northern california
out1 = subset(res,cause == 1 & (eco1 == 6 | eco1 == 7) & (month > 9))   #1=lightning; 14=unknown; 7=arson
out2 = subset(res,cause !=1 & cause != 14 & (eco1 == 6 | eco1 == 7) & (month > 9))

hist.a =hist(out1$ros_km,breaks =c(0,0.01,0.05,0.1,0.25,0.5,1,2,5,10,20,30),plot=F)
hist.b =hist(out2$ros_km,breaks =c(0,0.01,0.05,0.1,0.25,0.5,1,2,5,10,20,30),plot=F)
fg = rbind(hist.a$counts,hist.b$counts)

fr = barplot(fg, beside=TRUE,xlab="Rate-of-Spread (km/day)",ylab="Number of fire days",cex.lab=1.4,cex.axis = 1.3)
axis(1,at=c(0.5,3.5,6.5,9.5,12.5,15.5,18.5,21.5,24.5,27.5,30.5,33.5),labels=hist.a$breaks,cex.axis = 1.3)
legend("topright",legend = c("human","lightning"), fill=c("grey","black"),cex=1.4,bty = "n")


############ autumn mediterean california
out1 = subset(res,cause == 1 & eco1 == 11 & (month > 9))   #1=lightning; 14=unknown; 7=arson
out2 = subset(res,cause !=1 & cause != 14 & eco1 == 11 & (month > 9))

hist.a =hist(out1$ros_km,breaks =c(0,0.01,0.05,0.1,0.25,0.5,1,2,5,10,20,30),plot=F)
hist.b =hist(out2$ros_km,breaks =c(0,0.01,0.05,0.1,0.25,0.5,1,2,5,10,20,30),plot=F)
fg = rbind(hist.a$counts,hist.b$counts)

fr = barplot(fg, beside=TRUE,xlab="Rate-of-Spread (km/day)",ylab="Number of fire days",cex.lab=1.4,cex.axis = 1.3)
axis(1,at=c(0.5,3.5,6.5,9.5,12.5,15.5,18.5,21.5,24.5,27.5,30.5,33.5),labels=hist.a$breaks,cex.axis = 1.3)
legend("topright",legend = c("human","lightning"), fill=c("grey","black"),cex=1.4,bty = "n")


############ summer northern california
out1 = subset(res,cause == 1 & (eco1 == 6 | eco1 == 7) & (month > 5 & month<10))   #1=lightning; 14=unknown; 7=arson
out2 = subset(res,cause !=1 & cause != 14 & (eco1 == 6 | eco1 == 7) & (month > 5 & month<10))

hist.a =hist(out1$ros_km,breaks =c(0,0.01,0.05,0.1,0.25,0.5,1,2,5,10,20,30),plot=F)
hist.b =hist(out2$ros_km,breaks =c(0,0.01,0.05,0.1,0.25,0.5,1,2,5,10,20,30),plot=F)
fg = rbind(hist.a$counts,hist.b$counts)

fr = barplot(fg, beside=TRUE,xlab="Rate-of-Spread (km/day)",ylab="Number of fire days",cex.lab=1.4,cex.axis = 1.3)
axis(1,at=c(0.5,3.5,6.5,9.5,12.5,15.5,18.5,21.5,24.5,27.5,30.5,33.5),labels=hist.a$breaks,cex.axis = 1.3)
legend("topright",legend = c("human","lightning"), fill=c("grey","black"),cex=1.4,bty = "n")


############ summer mediterean california
out1 = subset(res,cause == 1 & eco1 == 11  & (month > 5 & month<10))   #1=lightning; 14=unknown; 7=arson
out2 = subset(res,cause !=1 & cause != 14 & eco1 == 11  & (month > 5 & month<10))

hist.a =hist(out1$ros_km,breaks =c(0,0.01,0.05,0.1,0.25,0.5,1,2,5,10,20,30),plot=F)
hist.b =hist(out2$ros_km,breaks =c(0,0.01,0.05,0.1,0.25,0.5,1,2,5,10,20,30),plot=F)
fg = rbind(hist.a$counts,hist.b$counts)

fr = barplot(fg, beside=TRUE,xlab="Rate-of-Spread (km/day)",ylab="Number of fire days",cex.lab=1.4,cex.axis = 1.3)
axis(1,at=c(0.5,3.5,6.5,9.5,12.5,15.5,18.5,21.5,24.5,27.5,30.5,33.5),labels=hist.a$breaks,cex.axis = 1.3)
legend("topright",legend = c("human","lightning"), fill=c("grey","black"),cex=1.4,bty = "n")


out1 = subset(res,cause == 1 )   #1=lightning; 14=unknown; 7=arson
out2 = subset(res,cause !=1 & cause != 14 )

mean(out1$ros_km,na.rm=T)
[1] 0.8405408
mean(out2$ros_km,na.rm=T)
[1] 1.82709
#0,0.25,0.5,1,2,3,5,7,10,20,30
hist.a =hist(out1$ros_km,breaks =c(0,0.5,1,2,3,5,7,10,20,30),plot=F)
hist.b =hist(out2$ros_km,breaks =c(0,0.5,1,2,3,5,7,10,20,30),plot=F)
fg = rbind(hist.a$counts,hist.b$counts)
dens = rbind((hist.a$counts/(sum(hist.a$counts)))*100,(hist.b$counts/(sum(hist.b$counts)))*100)

fr = barplot(fg, beside=TRUE,xlab="Rate-of-Spread (km/day)",ylab="Number of fire days",cex.lab=1.4,cex.axis = 1.3)
axis(1,at=c(0.5,3.5,6.5,9.5,12.5,15.5,18.5,21.5,24.5,27.5),labels=hist.a$breaks,cex.axis = 1.3)
legend("topright",legend = c("human","lightning"), fill=c("grey","black"),cex=1.4,bty = "n")


fr = barplot(dens, beside=TRUE,xlab=expression('Rate-of-Spread (km d'^-1*')'),ylab="% fire days",ylim=c(0,60),cex.lab=1.4,cex.axis = 1.3)
axis(1,at=c(0.5,3.5,6.5,9.5,12.5,15.5,18.5,21.5,24.5,27.5),labels=hist.a$breaks,cex.axis = 1.3)
legend("topright",legend = c("human","lightning"), fill=c("grey","black"),cex=1.4,bty = "n")

tiff("/Users/stijnhantson/Documents/Documents/articulos/en_proceso/VIIRS_ros/figure2_freq_v1.tif", width = 6, height = 5, units = 'in', res = 300)
fr = barplot(dens, beside=TRUE,xlab=expression('Rate-of-Spread (km d'^-1*')'),ylab="% fire days",ylim=c(0,60),cex.lab=1.4,cex.axis = 1.3)
axis(1,at=c(0.5,3.5,6.5,9.5,12.5,15.5,18.5,21.5,24.5,27.5),labels=hist.a$breaks,cex.axis = 1.3)
legend("topright",legend = c("human","lightning"), fill=c("grey","black"),cex=1.4,bty = "n")
dev.off() 
quartz_off_screen 
                2 

############ autumn northern california
out1 = subset(res,cause == 1 & (eco1 == 6 | eco1 == 7) & (month > 9))   #1=lightning; 14=unknown; 7=arson
out2 = subset(res,cause !=1 & cause != 14 & (eco1 == 6 | eco1 == 7) & (month > 9))

hist.a =hist(out1$ros_km,breaks =c(0,0.5,1,2,3,5,7,10,20,30),plot=F)
hist.b =hist(out2$ros_km,breaks =c(0,0.5,1,2,3,5,7,10,20,30),plot=F)
fg = rbind(hist.a$counts,hist.b$counts)
dens = rbind((hist.a$counts/(sum(hist.a$counts)))*100,(hist.b$counts/(sum(hist.b$counts)))*100)

fr = barplot(fg, beside=TRUE,xlab="Rate-of-Spread (km/day)",ylab="Number of fire days",cex.lab=1.4,cex.axis = 1.3)
axis(1,at=c(0.5,3.5,6.5,9.5,12.5,15.5,18.5,21.5,24.5,27.5),labels=hist.a$breaks,cex.axis = 1.3)
legend("topright",legend = c("human","lightning"), fill=c("grey","black"),cex=1.4,bty = "n")


fr = barplot(dens, beside=TRUE,xlab="Rate-of-Spread (km/day)",ylab="% fire days",ylim=c(0,80),cex.lab=1.4,cex.axis = 1.3)
axis(1,at=c(0.5,3.5,6.5,9.5,12.5,15.5,18.5,21.5,24.5,27.5),labels=hist.a$breaks,cex.axis = 1.3)
legend("topright",legend = c("human","lightning"), fill=c("grey","black"),cex=1.4,bty = "n")

tiff("/Users/stijnhantson/Documents/Documents/articulos/en_proceso/VIIRS_ros/S4_freq_autumn_north_v1.tif", width = 6, height = 5, units = 'in', res = 300)
fr = barplot(dens, beside=TRUE,xlab=expression('Rate-of-Spread (km d'^-1*')'),ylab="% fire days",ylim=c(0,80),cex.lab=1.4,cex.axis = 1.3)
axis(1,at=c(0.5,3.5,6.5,9.5,12.5,15.5,18.5,21.5,24.5,27.5),labels=hist.a$breaks,cex.axis = 1.3)
legend("topright",legend = c("human","lightning"), fill=c("grey","black"),cex=1.4,bty = "n")
dev.off() 
quartz_off_screen 
                2 

############ autumn mediterean california
out1 = subset(res,cause == 1 & eco1 == 11 & (month > 9))   #1=lightning; 14=unknown; 7=arson
out2 = subset(res,cause !=1 & cause != 14 & eco1 == 11 & (month > 9))

hist.a =hist(out1$ros_km,breaks =c(0,0.5,1,2,3,5,7,10,20,30),plot=F)
hist.b =hist(out2$ros_km,breaks =c(0,0.5,1,2,3,5,7,10,20,30),plot=F)
fg = rbind(hist.a$counts,hist.b$counts)
dens = rbind((hist.a$counts/(sum(hist.a$counts)))*100,(hist.b$counts/(sum(hist.b$counts)))*100)

fr = barplot(fg, beside=TRUE,xlab="Rate-of-Spread (km/day)",ylab="Number of fire days",cex.lab=1.4,cex.axis = 1.3)
axis(1,at=c(0.5,3.5,6.5,9.5,12.5,15.5,18.5,21.5,24.5,27.5),labels=hist.a$breaks,cex.axis = 1.3)
legend("topright",legend = c("human","lightning"), fill=c("grey","black"),cex=1.4,bty = "n")


fr = barplot(dens, beside=TRUE,xlab="Rate-of-Spread (km/day)",ylab="% fire days",cex.lab=1.4,cex.axis = 1.3)
axis(1,at=c(0.5,3.5,6.5,9.5,12.5,15.5,18.5,21.5,24.5,27.5),labels=hist.a$breaks,cex.axis = 1.3)
legend("topright",legend = c("human","lightning"), fill=c("grey","black"),cex=1.4,bty = "n")

tiff("/Users/stijnhantson/Documents/Documents/articulos/en_proceso/VIIRS_ros/S4_freq_autumn_med_v1.tif", width = 6, height = 5, units = 'in', res = 300)
fr = barplot(dens, beside=TRUE,xlab=expression('Rate-of-Spread (km d'^-1*')'),ylab="% fire days",ylim=c(0,25),cex.lab=1.4,cex.axis = 1.3)
axis(1,at=c(0.5,3.5,6.5,9.5,12.5,15.5,18.5,21.5,24.5,27.5),labels=hist.a$breaks,cex.axis = 1.3)
legend("topright",legend = c("human","lightning"), fill=c("grey","black"),cex=1.4,bty = "n")
dev.off() 
quartz_off_screen 
                2 

############ summer northern california
out1 = subset(res,cause == 1 & (eco1 == 6 | eco1 == 7) & (month > 5 & month<10))   #1=lightning; 14=unknown; 7=arson
out2 = subset(res,cause !=1 & cause != 14 & (eco1 == 6 | eco1 == 7) & (month > 5 & month<10))

hist.a =hist(out1$ros_km,breaks =c(0,0.5,1,2,3,5,7,10,20,30),plot=F)
hist.b =hist(out2$ros_km,breaks =c(0,0.5,1,2,3,5,7,10,20,30),plot=F)
fg = rbind(hist.a$counts,hist.b$counts)
dens = rbind((hist.a$counts/(sum(hist.a$counts)))*100,(hist.b$counts/(sum(hist.b$counts)))*100)

fr = barplot(fg, beside=TRUE,xlab="Rate-of-Spread (km/day)",ylab="Number of fire days",cex.lab=1.4,cex.axis = 1.3)
axis(1,at=c(0.5,3.5,6.5,9.5,12.5,15.5,18.5,21.5,24.5,27.5),labels=hist.a$breaks,cex.axis = 1.3)
legend("topright",legend = c("human","lightning"), fill=c("grey","black"),cex=1.4,bty = "n")


fr = barplot(dens, beside=TRUE,xlab="Rate-of-Spread (km/day)",ylab="% fire days",cex.lab=1.4,cex.axis = 1.3)
axis(1,at=c(0.5,3.5,6.5,9.5,12.5,15.5,18.5,21.5,24.5,27.5),labels=hist.a$breaks,cex.axis = 1.3)
legend("topright",legend = c("human","lightning"), fill=c("grey","black"),cex=1.4,bty = "n")

tiff("/Users/stijnhantson/Documents/Documents/articulos/en_proceso/VIIRS_ros/S4_freq_summer_north_v1.tif", width = 6, height = 5, units = 'in', res = 300)
fr = barplot(dens, beside=TRUE,xlab=expression('Rate-of-Spread (km d'^-1*')'),ylab="% fire days",ylim=c(0,60),cex.lab=1.4,cex.axis = 1.3)
axis(1,at=c(0.5,3.5,6.5,9.5,12.5,15.5,18.5,21.5,24.5,27.5),labels=hist.a$breaks,cex.axis = 1.3)
legend("topright",legend = c("human","lightning"), fill=c("grey","black"),cex=1.4,bty = "n")
dev.off() 
quartz_off_screen 
                2 

############ summer mediterean california
out1 = subset(res,cause == 1 & eco1 == 11  & (month > 5 & month<10))   #1=lightning; 14=unknown; 7=arson
out2 = subset(res,cause !=1 & cause != 14 & eco1 == 11  & (month > 5 & month<10))

hist.a =hist(out1$ros_km,breaks =c(0,0.5,1,2,3,5,7,10,20,30),plot=F)
hist.b =hist(out2$ros_km,breaks =c(0,0.5,1,2,3,5,7,10,20,30),plot=F)
fg = rbind(hist.a$counts,hist.b$counts)
dens = rbind((hist.a$counts/(sum(hist.a$counts)))*100,(hist.b$counts/(sum(hist.b$counts)))*100)

fr = barplot(fg, beside=TRUE,xlab="Rate-of-Spread (km/day)",ylab="Number of fire days",cex.lab=1.4,cex.axis = 1.3)
axis(1,at=c(0.5,3.5,6.5,9.5,12.5,15.5,18.5,21.5,24.5,27.5),labels=hist.a$breaks,cex.axis = 1.3)
legend("topright",legend = c("human","lightning"), fill=c("grey","black"),cex=1.4,bty = "n")


fr = barplot(dens, beside=TRUE,xlab="Rate-of-Spread (km/day)",ylab="% fire days",cex.lab=1.4,cex.axis = 1.3)
axis(1,at=c(0.5,3.5,6.5,9.5,12.5,15.5,18.5,21.5,24.5,27.5),labels=hist.a$breaks,cex.axis = 1.3)
legend("topright",legend = c("human","lightning"), fill=c("grey","black"),cex=1.4,bty = "n")

tiff("/Users/stijnhantson/Documents/Documents/articulos/en_proceso/VIIRS_ros/S4_freq_summer_med_v1.tif", width = 6, height = 5, units = 'in', res = 300)
fr = barplot(dens, beside=TRUE,xlab=expression('Rate-of-Spread (km d'^-1*')'),ylab="% fire days",cex.lab=1.4,cex.axis = 1.3)
axis(1,at=c(0.5,3.5,6.5,9.5,12.5,15.5,18.5,21.5,24.5,27.5),labels=hist.a$breaks,cex.axis = 1.3)
legend("topright",legend = c("human","lightning"), fill=c("grey","black"),cex=1.4,bty = "n")
dev.off() 
quartz_off_screen 
                2 

20 fastest fires


res1 = res[res$ros_km > 10 & !is.na(res$ros_km),]
length(res1$ros_km)
res1

are ROS the same for light & human under the same conditions

out1 = subset(res,cause == 1 )   #1=lightning; 14=unknown; 7=arson
out2 = subset(res,cause !=1 & cause != 14 )

plot(out1$vpd,log(out1$ros_km))
points(out2$vpd,log(out2$ros_km),col="red")

summary(lm(out1$vpd~log(out1$ros_km+1),na.omit=T))
summary(lm(out2$vpd~log(out2$ros_km+1)))

analysis of the first day

load data


daily_res=read.table("/Users/stijnhantson/Documents/projects/VIIRS_ros/all_ignitions_V3.txt",header=T)

res=as.data.frame(daily_res)

res$bi =as.numeric(as.character(res$bi))
res$erc =as.numeric(as.character(res$erc))
res$etr =as.numeric(as.character(res$etr))
res$fm100 =as.numeric(as.character(res$fm100))
res$fm1000 =as.numeric(as.character(res$fm1000))
res$pet =as.numeric(as.character(res$pet))
res$pr =as.numeric(as.character(res$pr))
res$rmax =as.numeric(as.character(res$rmax))
res$rmin =as.numeric(as.character(res$rmin))
res$th =as.numeric(as.character(res$th))
res$tmmn =as.numeric(as.character(res$tmmn))
res$tmmx =as.numeric(as.character(res$tmmx))
res$vpd =as.numeric(as.character(res$vpd))
res$ws =as.numeric(as.character(res$ws))
res$vs =as.numeric(as.character(res$vs))
res$total_area =as.numeric(as.character(res$total_area))
res$max_land =as.numeric(as.character(res$max_land))
res$mean_land =as.numeric(as.character(res$mean_land))

res$biomass =as.numeric(as.character(res$biomass))

res = res[-1,]
res$human[res$cause ==1] =1
res$human[res$cause !=1 & res$cause !=14] =0

analysis


out1 = res[res$cause !=1 & res$cause != 14,] 
out2 = res[res$cause ==1,] 

out1 = subset(res,(eco1 == 6 |eco1 == 7) & res$cause !=1 & res$cause != 14)   #1=lightning; 14=unknown; 7=arson
out2 = subset(res,(eco1 == 6 |eco1 == 7) & res$cause ==1)   #1=lightning; 14=unknown; 7=arson

out1 = subset(res,eco1 == 11& res$cause !=1 & res$cause != 14)
out2 = subset(res,eco1 == 11 & res$cause ==1)

out1 = subset(res,(eco1 == 6 |eco1 == 7) & res$cause !=1 & res$cause != 14 & res$mont > 5 & res$mont < 10 )   #1=lightning; 14=unknown; 7=arson
out2 = subset(res,(eco1 == 6 |eco1 == 7) & res$cause ==1& res$mont > 5 & res$mont < 10)   #1=lightning; 14=unknown; 7=arson

t.test(out1$bi,out2$bi)
t.test(out1$erc,out2$erc)
t.test(out1$etr,out2$etr)
t.test(out1$fm100,out2$fm100)
t.test(out1$fm1000,out2$fm1000)
t.test(out1$pet,out2$pet)
t.test(out1$pr,out2$pr)
t.test(out1$rmax,out2$rmax)
t.test(out1$rmin,out2$rmin)
t.test(out1$th,out2$th)
t.test(out1$tmmn,out2$tmmn)
t.test(out1$tmmx,out2$tmmx)
t.test(out1$vpd,out2$vpd)
t.test(out1$vs,out2$vs)
t.test(out1$ws,out2$ws)
t.test(out1$biomass,out2$biomass)
t.test(out1$mean_land,out2$mean_land)
t.test(log10(out1$total_area),log10(out2$total_area))

ta = table(res$human,res$mont)
ps = barplot(ta, beside=TRUE, ylab="number of fires",xpd=T,xlab= "month", xaxt='n',ylim=c(0,300), axis.lty=1,cex.lab = 1.4,cex.axis = 1.2 )
axis(1,at=c(2,5,8,11,14,17,20,23,26,29,32,35), labels =c(1:12),xlim=c(0,36),xpd=F ,cex.lab = 1.4,cex.axis = 1.3)
legend("topright",c("human","lightning"),fill = c("grey", "black"), bty="n",cex=1.4)
text(1,285,"a)",cex=1.8)
out1 = subset(res,eco1 == 6 |eco1 == 7)   #1=lightning; 14=unknown; 7=arson
out2 = subset(res,eco1 == 11)

ta = table(out1$human,out1$mont)
ps = barplot(ta, beside=TRUE, ylab="number of fires",xpd=T, xaxt='n',xlab= "month", ylim=c(0,200), axis.lty=1,cex.lab = 1.4,cex.axis = 1.2 )
axis(1,at=c(2,5,8,11,14,17,20,23,26,29,32,35), labels =c(1:12),xlim=c(0,36),xpd=F,cex.lab = 1.4,cex.axis = 1.3 )
legend("topright",c("human","lightning"),fill = c("grey", "black"), bty="n",cex=1.4)
text(1,190,"b)",cex=1.8)

ta = table(out2$human,out2$mont)
ps = barplot(ta, beside=TRUE, ylab="number of fires",xpd=T,xaxt='n',xlab= "month", ylim=c(0,200), axis.lty=1,cex.lab = 1.4,cex.axis = 1.2 )
axis(1,at=c(2,5,8,11,14,17,20,23,26,29,32,35), labels =c(1:12),xlim=c(0,36),xpd=F,cex.lab = 1.4,cex.axis = 1.3 )
legend("topright",c("human","lightning"),fill = c("grey", "black"), bty="n",cex=1.4)
text(1,190,"c)",cex=1.8)
data_s=read.table("/Users/stijnhantson/Documents/projects/VIIRS_ros/daily_mean_ros_dNBR_V6.txt",row.names=NULL)
rownames(data_s) <- c()

data_s1 = as.data.frame(data_s[,2:19])


names(data_s1) = c("lon","lat","fire","nr_day","max_land","mean_land","elevation","biomass","mean_ros","ros95","mean_dnbr","dnbr95","mean_rdnbr","rdnbr95","mean_BA_red","BA_red95","cause","size")
length(data_s1$lon)
[1] 2459
data_s1$mean_ros =as.numeric(as.character(data_s1$mean_ros))
data_s1$ros95 =as.numeric(as.character(data_s1$ros95))
data_s1$mean_dnbr =as.numeric(as.character(data_s1$mean_dnbr))
data_s1$dnbr95 =as.numeric(as.character(data_s1$dnbr95))
data_s1$mean_rdnbr =as.numeric(as.character(data_s1$mean_rdnbr))
data_s1$rdnbr95 =as.numeric(as.character(data_s1$rdnbr95))
data_s1$lon =as.numeric(as.character(data_s1$lon))
data_s1$lat =as.numeric(as.character(data_s1$lat))

data_s1$mean_land[is.na(data_s1$mean_land)]=data_s1$max_land[is.na(data_s1$mean_land)] #mean landcover gives NA when only one landcover is present
data_s1$mean_land =as.numeric(as.character(data_s1$mean_land))
data_s1$mean_BA_red =as.numeric(as.character(data_s1$mean_BA_red))
data_s1$BA_red95 =as.numeric(as.character(data_s1$BA_red95))
data_s1$biomass =as.numeric(as.character(data_s1$biomass))
data_s1$elevation =as.numeric(as.character(data_s1$elevation))
data_s1$cause =as.numeric(as.character(data_s1$cause))
data_s1$size =as.numeric(as.character(data_s1$size))

data_s1=na.omit(data_s1)

shape = shapefile("/Users/stijnhantson/Documents/data/veg_california/ca_eco_l3/ca_eco_l3.shp")
pts <- SpatialPoints(data_s1[,c("lon","lat")],P4S.latlon)
shape = spTransform(shape,P4S.latlon)
eco = over(pts, shape)
data_s1$L1CODE = eco$NA_L1CODE
data_s1$L3name = eco$US_L3NAME
data_s1$L1CODE =as.numeric(as.character(data_s1$L1CODE))

#data_s1$log_ros = log10(data_s1$mean_ros)
#data_s1$log_ros95 = log10(data_s1$ros95)
#data_s1 = data_s1[data_s1$mean_ros >0,]
data_s1$human[data_s1$cause !=1 & data_s1$cause !=14 & data_s1$cause !=17]=1
data_s1$human[data_s1$cause ==1 ]=2

data_s1$ros_km = (data_s1$ros95 *24)/1000
data_test = data_s1[data_s1$max_land == 1,]
data_test1 = data_s1[data_s1$L1CODE == 6 |data_s1$L1CODE == 7 ,]
data_test2 = data_s1[data_s1$L1CODE == 11,]

data_test1 = data_s1[data_s1$human == 1 & (data_s1$L1CODE == 6 |data_s1$L1CODE == 7),]
data_test2 = data_s1[data_s1$human == 2 & (data_s1$L1CODE == 6 |data_s1$L1CODE == 7),]

data_test1 = data_s1[data_s1$human == 1 ,]
data_test2 = data_s1[data_s1$human == 2 ,]

data_test1=na.omit(data_test1)
data_test2=na.omit(data_test2)

plot(data_s1$ros_km, data_s1$mean_BA_red,log="x",xlab="Rate-of-Spread (km/day)",ylab="Tree mortality (%)",xlim=c(0.005,30),xaxt="n",cex.axis=1.4 ,cex.lab=1.4,cex=0.8, col="black")
50 x values <= 0 omitted from logarithmic plot
axis(1,at=marks,labels=marks,cex.axis=1.4 )
points(data_test2$ros_km, data_test2$mean_BA_red,cex=0.8, col="darkgrey")
points(data_test1$ros_km, data_test1$mean_BA_red,cex=0.8, col="orange")


marks=c(0.01,0.1,1,10)
tiff("/Users/stijnhantson/Documents/Documents/articulos/en_proceso/VIIRS_ros/fig_basa_ros_all_v3.tif", width = 5, height = 5, units = 'in', res = 300)
plot(data_s1$ros_km, data_s1$mean_BA_red,log="x",xlab="Rate-of-Spread (km/day)",ylab="Tree mortality (%)",xlim=c(0.005,30),xaxt="n",cex.axis=1.4 ,cex.lab=1.4,cex=0.8, col="black")
50 x values <= 0 omitted from logarithmic plot
axis(1,at=marks,labels=marks,cex.axis=1.4 )
points(data_test2$ros_km, data_test2$mean_BA_red,cex=0.8, col="darkgrey")
points(data_test1$ros_km, data_test1$mean_BA_red,cex=0.8, col="orange")
lines(lowess(data_s1$ros_km, data_s1$mean_BA_red, f=0.41),col="black", lwd=3)
lines(lowess(data_test1$ros_km, data_test1$mean_BA_red, f=0.41),col="darkgoldenrod3", lwd=3)
lines(lowess(data_test2$ros_km, data_test2$mean_BA_red, f=0.41),col="gray40", lwd=3)
legend("topleft",legend=c("all","human","lightning"),col = c("black","darkgoldenrod3", "gray40"),lty=1, bty="n",lwd = 3, cex=1)
dev.off()
quartz_off_screen 
                2 
data_test1 = data_s1[data_s1$human == 1 & data_s1$max_land <1.5,]
data_test2 = data_s1[data_s1$human == 2 & data_s1$max_land <1.5,]
data_forest = data_s1[data_s1$max_land <1.5,]
data_test1=na.omit(data_test1)
data_test2=na.omit(data_test2)

data_s2 = data_s1[data_s1$ros_km <10,]
data_forest_10 = data_s2[data_s2$max_land <1.5,]
data_test1_10 = data_s2[data_s2$human == 1 & data_s2$max_land <1.5,]
data_test2_10 = data_s2[data_s2$human == 2 & data_s2$max_land <1.5,]
data_test1_10=na.omit(data_test1_10)
data_test2_10=na.omit(data_test2_10)

marks=c(0.01,0.1,1,10)
tiff("/Users/stijnhantson/Documents/Documents/articulos/en_proceso/VIIRS_ros/fig_basa_ros_forest_v3.tif", width = 5, height = 5, units = 'in', res = 300)
plot(data_forest$ros_km, data_forest$mean_BA_red,log="x",xlab="Rate-of-Spread (km/day)",ylab="Tree mortality (%)",xlim=c(0.005,30),xaxt="n",cex.axis=1.4 ,cex.lab=1.4,cex=0.8, col="black")
46 x values <= 0 omitted from logarithmic plot
axis(1,at=marks,labels=marks,cex.axis=1.4 )
points(data_test2$ros_km, data_test2$mean_BA_red,cex=0.8, col="darkgrey")
points(data_test1$ros_km, data_test1$mean_BA_red,cex=0.8, col="orange")
lines(lowess(data_forest_10$ros_km, data_forest_10$mean_BA_red, f=0.41),col="black", lwd=3)
lines(lowess(data_test1_10$ros_km, data_test1_10$mean_BA_red, f=0.41),col="darkgoldenrod3", lwd=3)
lines(lowess(data_test2_10$ros_km, data_test2_10$mean_BA_red, f=0.41),col="gray40", lwd=3)
legend("topleft",legend=c("all","human","lightning"),col = c("black","darkgoldenrod3", "gray40"),lty=1, bty="n",lwd = 3, cex=1)
dev.off()
quartz_off_screen 
                2 
marks=c(0.01,0.1,1,10)
tiff("/Users/stijnhantson/Documents/Documents/articulos/en_proceso/VIIRS_ros/fig_basa_ros_forest_v4.tif", width = 5, height = 5, units = 'in', res = 300)
plot(data_forest$ros_km, data_forest$mean_BA_red,log="x",xlab="Rate-of-Spread (km/day)",ylab="Tree mortality (%)",xlim=c(0.1,15),xaxt="n",cex.axis=1.4 ,cex.lab=1.4,cex=0.8, col="black")
46 x values <= 0 omitted from logarithmic plot
axis(1,at=marks,labels=marks,cex.axis=1.4 )
points(data_test2$ros_km, data_test2$mean_BA_red,cex=0.8, col="darkgrey")
points(data_test1$ros_km, data_test1$mean_BA_red,cex=0.8, col="orange")
lines(lowess(data_forest_10$ros_km, data_forest_10$mean_BA_red, f=0.41),col="black", lwd=3)
lines(lowess(data_test1_10$ros_km, data_test1_10$mean_BA_red, f=0.41),col="darkgoldenrod3", lwd=3)
lines(lowess(data_test2_10$ros_km, data_test2_10$mean_BA_red, f=0.41),col="gray40", lwd=3)
legend("topleft",legend=c("all","human","lightning"),col = c("black","darkgoldenrod3", "gray40"),lty=1, bty="n",lwd = 3, cex=1)
dev.off()
quartz_off_screen 
                2 

plot(data_forest$ros_km, data_forest$mean_BA_red,log="x",xlab="Rate-of-Spread (km/day)",ylab="Tree mortality (%)",xlim=c(0.1,15),xaxt="n",cex.axis=1.4 ,cex.lab=1.4,cex=0.8, col="black")
46 x values <= 0 omitted from logarithmic plot
axis(1,at=marks,labels=marks,cex.axis=1.4 )
points(data_test2$ros_km, data_test2$mean_BA_red,cex=0.8, col="darkgrey")
points(data_test1$ros_km, data_test1$mean_BA_red,cex=0.8, col="orange")
lines(lowess(data_forest_10$ros_km, data_forest_10$mean_BA_red, f=0.41),col="black", lwd=3)
lines(lowess(data_test1_10$ros_km, data_test1_10$mean_BA_red, f=0.41),col="darkgoldenrod3", lwd=3)
lines(lowess(data_test2_10$ros_km, data_test2_10$mean_BA_red, f=0.41),col="gray40", lwd=3)
legend("topleft",legend=c("all","human","lightning"),col = c("black","darkgoldenrod3", "gray40"),lty=1, bty="n",lwd = 3, cex=1)

NA
NA

data_test = data_s1[data_s1$max_land == 1,]
data_test1 = data_s1[data_s1$L1CODE == 6 |data_s1$L1CODE == 7 ,]
data_test2 = data_s1[data_s1$L1CODE == 11,]

data_test1 = data_s1[data_s1$human == 1 & (data_s1$L1CODE == 6 |data_s1$L1CODE == 7),]
data_test2 = data_s1[data_s1$human == 2 & (data_s1$L1CODE == 6 |data_s1$L1CODE == 7),]

data_test1 = data_s1[data_s1$human == 1 ,]
data_test2 = data_s1[data_s1$human == 2 ,]


fast = data_s1[data_s1$ros_km > 1,]
fast_hum = fast[fast$human == 1,]

print("% BA and % of fire days fast fires > 1km/day")
[1] "% BA and % of fire days fast fires > 1km/day"
sum(fast$size)/sum(data_s1$size)
[1] 0.8359887
length(fast$size)/length(data_s1$size)
[1] 0.3371951
print("% BA  fast fires due to human ignition % of fire days human caused fast fires > 1km/day")
[1] "% BA  fast fires due to human ignition % of fire days human caused fast fires > 1km/day"
sum(fast_hum$size, na.rm=T)/sum(fast$size)
[1] 0.4634998
length(fast_hum$size)/length(fast$size)
[1] 0.4195298
all_min1 = data_s1[data_s1$nr_day != 1,] # remove first fire spread day from statistics

quan = quantile(data_s1$ros_km,0.9)
fast = data_s1[data_s1$ros_km > quan,]
slow = data_s1[data_s1$ros_km < quan,]
fast_hum = fast[fast$human == 1,]

print("fastest 10% fires cause xxx% of BA")
[1] "fastest 10% fires cause xxx% of BA"
sum(fast$size)/sum(all_min1$size)
[1] 0.5493523
length(fast$size)/length(all_min1$size)
[1] 0.1
print("mean tree mortality weighted by BA and just mean")
[1] "mean tree mortality weighted by BA and just mean"
sum((data_s1$mean_BA_red*data_s1$size))/(sum(data_s1$size))
[1] 49.03327
mean(data_s1$mean_BA_red)
[1] 25.64874
print("% BA due to human fires amoung fastest 10% fire days")
[1] "% BA due to human fires amoung fastest 10% fire days"
sum(fast_hum$size, na.rm=T)/sum(fast$size)
[1] 0.5143879
print("% fire number due to human fires amoung fastest 10% fire days")
[1] "% fire number due to human fires amoung fastest 10% fire days"
length(fast_hum$size)/length(fast$size)
[1] 0.5060976
print("% tree mortality fast fires weighthed and not")
[1] "% tree mortality fast fires weighthed and not"
sum((fast$mean_BA_red*fast$size))/(sum(fast$size))
[1] 60.02651
mean(fast$mean_BA_red)
[1] 52.79125
print("% tree mortality slow fires weighthed and not")
[1] "% tree mortality slow fires weighthed and not"
sum((slow$mean_BA_red*slow$size))/(sum(slow$size))
[1] 35.63221
mean(slow$mean_BA_red)
[1] 22.63291
# plot BA per rate of spread 
out1 = subset(data_s1,cause == 1 )   #1=lightning; 14=unknown; 7=arson
out2 = subset(data_s1,cause !=1 & cause != 14 )

breaks =c(0,0.5,1,2,3,5,7,10,20,30)

tt=0
pp=0
for (i in 1:9){

  kr = out1[out1$ros_km >= breaks[i] & out1$ros_km < breaks[i+1],]
  kp = out2[out2$ros_km >= breaks[i] & out2$ros_km < breaks[i+1],]

tt[i]=sum(kr$size, na.rm=T)/1000000
pp[i]= sum(kp$size, na.rm=T)/1000000
}

fg = rbind(tt,pp)

par(mar=c(4, 5, 2,0.1))
fr = barplot(fg, beside=TRUE,xlab="Rate-of-Spread (km/day)",ylab=expression('burnt area (km'^2*')'),ylim=c(0,2000),cex.lab=1.4,cex.axis = 1.3)
axis(1,at=c(0.5,3.5,6.5,9.5,12.5,15.5,18.5,21.5,24.5,27.5),labels=hist.a$breaks,cex.axis = 1.3)
legend("topright",legend = c("human","lightning"), fill=c("grey","black"),cex=1.4,bty = "n")


tiff("/Users/stijnhantson/Documents/Documents/articulos/en_proceso/VIIRS_ros/BA_per_ros_hist.tif", width = 6, height = 5, units = 'in', res = 300)
par(mar=c(4, 5, 2,0.1))
fr = barplot(fg, beside=TRUE,xlab="Rate-of-Spread (km/day)",ylab=expression('burnt area (km'^2*')'),ylim=c(0,2000),cex.lab=1.4,cex.axis = 1.3)
axis(1,at=c(0.5,3.5,6.5,9.5,12.5,15.5,18.5,21.5,24.5,27.5),labels=hist.a$breaks,cex.axis = 1.3)
legend("topright",legend = c("human","lightning"), fill=c("grey","black"),cex=1.4,bty = "n")
dev.off() 
quartz_off_screen 
                2 

When you save the notebook, an HTML file containing the code and output will be saved alongside it (click the Preview button or press Cmd+Shift+K to preview the HTML file).

The preview shows you a rendered HTML copy of the contents of the editor. Consequently, unlike Knit, Preview does not run any R code chunks. Instead, the output of the chunk when it was last run in the editor is displayed.

```

LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKVGhpcyBpcyBhbiBbUiBNYXJrZG93bl0oaHR0cDovL3JtYXJrZG93bi5yc3R1ZGlvLmNvbSkgTm90ZWJvb2suIFdoZW4geW91IGV4ZWN1dGUgY29kZSB3aXRoaW4gdGhlIG5vdGVib29rLCB0aGUgcmVzdWx0cyBhcHBlYXIgYmVuZWF0aCB0aGUgY29kZS4gCgoKQWRkIGEgbmV3IGNodW5rIGJ5IGNsaWNraW5nIHRoZSAqSW5zZXJ0IENodW5rKiBidXR0b24gb24gdGhlIHRvb2xiYXIgb3IgYnkgcHJlc3NpbmcgKkNtZCtPcHRpb24rSSouCgoKCgpgYGB7cn0KbGlicmFyeShyYXN0ZXIpCnNpemVfZGF0PXJlYWQudGFibGUoIi9Vc2Vycy9zdGlqbmhhbnRzb24vRG9jdW1lbnRzL3Byb2plY3RzL1ZJSVJTX3Jvcy9maXJlX2dyb3d0aF81ZGF5c192NC50eHQiLCBoZWFkZXI9VCwgcm93Lm5hbWVzPU5VTEwpCgpzaXplX2RhdD1hcy5kYXRhLmZyYW1lKHNpemVfZGF0KQpzaXplX2RhdD1zaXplX2RhdFstMSxdCnNpemVfZGF0PXNpemVfZGF0WywtMV0KY29sbmFtZXMoc2l6ZV9kYXQpPWMoImZpcmVuYW1lIiwieWVhciIsImNhdXNlIiwic2l6ZTEiLCJzaXplMiIsInNpemUzIiwic2l6ZTQiLCJzaXplNSIsImZpbmFsX2ZpcmVzaXplIiwibWVhbl9wcmVjaXAxIiwibWVhbl9wcmVjaXAyIiwibWVhbl9wcmVjaXAzIiwibWVhbl9wcmVjaXA0IiwibWVhbl9wcmVjaXA1IiwibWVhbl90bWF4MSIsIm1lYW5fdG1heDIiLCJtZWFuX3RtYXgzIiwibWVhbl90bWF4NCIsIm1lYW5fdG1heDUiLCJtZWFuX3RtZWFuMSIsIm1lYW5fdG1lYW4yIiwibWVhbl90bWVhbjMiLCJtZWFuX3RtZWFuNCIsIm1lYW5fdG1lYW41IiwibWVhbl92cGRtYXgxIiwibWVhbl92cGRtYXgyIiwibWVhbl92cGRtYXgzIiwibWVhbl92cGRtYXg0IiwibWVhbl92cGRtYXg1IiwibWVhbl93aW5kc3BlZWQxIiwibWVhbl93aW5kc3BlZWQyIiwibWVhbl93aW5kc3BlZWQzIiwibWVhbl93aW5kc3BlZWQ0IiwibWVhbl93aW5kc3BlZWQ1IiwibGFuZGNvdmVyIiwiZWNvc3lzdGVtIiwiYmlvbWFzcyIsImVsZXZhdGlvbiIpCgpzaXplX2RhdDIgPC0gZGF0YS5mcmFtZShsYXBwbHkoc2l6ZV9kYXQsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKHgpKSkpCnNpemVfZGF0MiRodW1hbiA9IDAKc2l6ZV9kYXQyJGh1bWFuW3NpemVfZGF0MiRjYXVzZSAhPTEgJiBzaXplX2RhdDIkY2F1c2UgIT0xNCAmIHNpemVfZGF0MiRjYXVzZSAhPTE3XT0xCnNpemVfZGF0MiRodW1hbltzaXplX2RhdDIkY2F1c2UgPT0xIF09MgoKcHJvMSA9c2l6ZV9kYXQyW3doaWNoKHNpemVfZGF0MiRodW1hbiA9PSAyICYgc2l6ZV9kYXQyJGxhbmRjb3ZlciA9PSAxICksIF0KcHJvMiA9c2l6ZV9kYXQyW3doaWNoKHNpemVfZGF0MiRodW1hbiA9PSAxICYgc2l6ZV9kYXQyJGxhbmRjb3ZlciA9PSAxICksIF0KCnQudGVzdChwcm8xJHNpemUxLHBybzIkc2l6ZTEpCnQudGVzdChwcm8xJHNpemUyLHBybzIkc2l6ZTIpCnQudGVzdChwcm8xJHNpemUzLHBybzIkc2l6ZTMpCnQudGVzdChwcm8xJHNpemU0LHBybzIkc2l6ZTQpCnQudGVzdChwcm8xJHNpemU1LHBybzIkc2l6ZTUpCgoKcHJvID1zaXplX2RhdDJbd2hpY2goc2l6ZV9kYXQyJGh1bWFuID09IDEgJiBzaXplX2RhdDIkbGFuZGNvdmVyID09IDEpLCBdCmxlbmd0aChwcm8keWVhcikKYm94cGxvdChwcm8kc2l6ZTEscHJvJHNpemUyLHBybyRzaXplMyxwcm8kc2l6ZTQscHJvJHNpemU1LG5hbWVzPWMoImRheTEiLCJkYXkyIiwiZGF5MyIsImRheTQiLCJkYXk1IikseGxhYj0iIix5bGFiPSJmaXJlIHNpemUgKGttMikiLHlsaW09YygwLDUwMCksIGNleC5sYWI9MS40LGNleC5heGlzID0gMS4zKQoKcHJvID1zaXplX2RhdDJbd2hpY2goc2l6ZV9kYXQyJGh1bWFuID09IDIgJiBzaXplX2RhdDIkbGFuZGNvdmVyID09IDEpLCBdCmxlbmd0aChwcm8keWVhcikKYm94cGxvdChwcm8kc2l6ZTEscHJvJHNpemUyLHBybyRzaXplMyxwcm8kc2l6ZTQscHJvJHNpemU1LG5hbWVzPWMoImRheTEiLCJkYXkyIiwiZGF5MyIsImRheTQiLCJkYXk1IikseGxhYj0iIix5bGFiPSJmaXJlIHNpemUgKGttMikiLHlsaW09YygwLDUwMCksIGNleC5sYWI9MS40LGNleC5heGlzID0gMS4zKQoKcHJvID1zaXplX2RhdDJbd2hpY2goc2l6ZV9kYXQyJGh1bWFuID09IDEgJiBzaXplX2RhdDIkbGFuZGNvdmVyID09IDIpLCBdCmxlbmd0aChwcm8keWVhcikKYm94cGxvdChwcm8kc2l6ZTEscHJvJHNpemUyLHBybyRzaXplMyxwcm8kc2l6ZTQscHJvJHNpemU1LG5hbWVzPWMoImRheTEiLCJkYXkyIiwiZGF5MyIsImRheTQiLCJkYXk1IikseGxhYj0iIix5bGFiPSJmaXJlIHNpemUgKGttMikiLHlsaW09YygwLDUwMCksIGNleC5sYWI9MS40LGNleC5heGlzID0gMS4zKQoKcHJvID1zaXplX2RhdDJbd2hpY2goc2l6ZV9kYXQyJGh1bWFuID09IDIgJiBzaXplX2RhdDIkbGFuZGNvdmVyID09IDIpLCBdCmxlbmd0aChwcm8keWVhcikKYm94cGxvdChwcm8kc2l6ZTEscHJvJHNpemUyLHBybyRzaXplMyxwcm8kc2l6ZTQscHJvJHNpemU1LG5hbWVzPWMoImRheTEiLCJkYXkyIiwiZGF5MyIsImRheTQiLCJkYXk1IikseGxhYj0iIix5bGFiPSJmaXJlIHNpemUgKGttMikiLHlsaW09YygwLDUwMCksIGNleC5sYWI9MS40LGNleC5heGlzID0gMS4zKQpsZW5ndGgoIWlzLm5hKHBybyRzaXplNSkpCgoKCnBybyA9c2l6ZV9kYXQyW3doaWNoKHNpemVfZGF0MiRodW1hbiA9PSAxICYgc2l6ZV9kYXQyJGVjb3N5c3RlbSA9PSA2KSwgXQpsZW5ndGgocHJvJHllYXIpCmJveHBsb3QocHJvJHNpemUxLHBybyRzaXplMixwcm8kc2l6ZTMscHJvJHNpemU0LHBybyRzaXplNSxuYW1lcz1jKCJkYXkxIiwiZGF5MiIsImRheTMiLCJkYXk0IiwiZGF5NSIpLHhsYWI9IiIseWxhYj0iZmlyZSBzaXplIChrbTIpIix5bGltPWMoMCw1MDApLCBjZXgubGFiPTEuNCxjZXguYXhpcyA9IDEuMykKCnBybyA9c2l6ZV9kYXQyW3doaWNoKHNpemVfZGF0MiRodW1hbiA9PSAyJiBzaXplX2RhdDIkZWNvc3lzdGVtID09IDYpLCBdCmxlbmd0aChwcm8keWVhcikKYm94cGxvdChwcm8kc2l6ZTEscHJvJHNpemUyLHBybyRzaXplMyxwcm8kc2l6ZTQscHJvJHNpemU1LG5hbWVzPWMoImRheTEiLCJkYXkyIiwiZGF5MyIsImRheTQiLCJkYXk1IikseGxhYj0iIix5bGFiPSJmaXJlIHNpemUgKGttMikiLHlsaW09YygwLDUwMCksIGNleC5sYWI9MS40LGNleC5heGlzID0gMS4zKQoKCmBgYAoKCgoKCiMjIyMjIyMjIyMjIyBwbG90IGZpcmUgc2l6ZSBtYXAgUUdJUyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpgYGB7cn0KbGlicmFyeShkYXRhLnRhYmxlKQpEVD0gZGF0YS50YWJsZShyZXMpCmZpcmVfc2l6ZSA9IERUWyAsIC5TRFt3aGljaC5taW4oZ3Jvd3RoX2ttKV0sIGJ5ID0gZmlyZW5hbWVdCgpmaXJlX3NpemUgPSBmaXJlX3NpemVbLGMoKV0Kc3ByZWFkX2xpc3QgPWxpc3QuZmlsZXModmlpcnNfZGlyLCBwYXR0ZXJuID0gIl9kYWlseS5zaHAkIiwgcmVjdXJzaXZlID0gVFJVRSwgZnVsbC5uYW1lcz1UKQppPTEKIGw9c2hhcGVmaWxlKHNwcmVhZF9saXN0W2ldKQpmb3IgKGkgaW4gMjpsZW5ndGgoc3ByZWFkX2xpc3QpKXsKICBwPXNoYXBlZmlsZShzcHJlYWRfbGlzdFtpXSkKICBsIDwtIHJiaW5kKGwsIHAsIG1ha2VVbmlxdWVJRHMgPSBUUlVFKSAKfQogbCRodW1hbiA9IDAKbCRodW1hbltsJENBVVNFICE9MSAmIGwkQ0FVU0UgIT0xNCAmIGwkQ0FVU0UgIT0xN109MQpsJGh1bWFuW2wkQ0FVU0UgPT0xIF09MgoKICAgICB3cml0ZU9HUihsLCAiL1VzZXJzL3N0aWpuaGFudHNvbi9Eb2N1bWVudHMvcHJvamVjdHMvVklJUlNfcm9zLyIsIGxheWVyPSAiYWxsX2ZpcmVzIiwgZHJpdmVyPSJFU1JJIFNoYXBlZmlsZSIsIG92ZXJ3cml0ZV9sYXllciA9IFQpCgpgYGAKCgoKCgojIyMjIyBleHRyYWN0IG51bWJlciBhbmQgc2l6ZSBzdGF0aXN0aWNzIGZyb20gZnJhcCAgICMjIyMjIyMjIyMjIyMjIyMKYGBge3J9CmxpYnJhcnkocmFzdGVyKQoKZHIgPXNoYXBlZmlsZSgiL1VzZXJzL3N0aWpuaGFudHNvbi9Eb2N1bWVudHMvcHJvamVjdHMvVklJUlNfcm9zL2ZyYXBfc3Vic2V0LnNocCIpCmRyMSA9c2hhcGVmaWxlKCIvVXNlcnMvc3Rpam5oYW50c29uL0RvY3VtZW50cy9kYXRhL0ZSQVAvZmlyZTE4XzEuc2hwIikKZHIxJFlFQVJfPWFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKGRyMSRZRUFSXykpCmRyMSRTaGFwZV9BcmVhPWFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKGRyMSRTaGFwZV9BcmVhKSkKZHIxPWRyMVshaXMubmEoZHIxJFlFQVJfKSwgXQpkcjE9ZHIxW2RyMSRZRUFSXz4yMDExLF0Kc3VtKGRyJFNoYXBlX0FyZWEpL3N1bShkcjEkU2hhcGVfQXJlYSkKc3VtKG5hLm9taXQoZHIkR0lTX0FDUkVTKSkvc3VtKG5hLm9taXQoZHIxJEdJU19BQ1JFUykpCgoKZHIkc3FrbSA9IGRyJEdJU19BQ1JFUyAqIDAuMDA0MDQ2ODU2NDIyNAptYXgoZHIkc3FrbSkKZHJfaCA9IGRyW2RyJENBVVNFICE9MSAmIGRyJENBVVNFICE9MTQsXQpkcl9sID0gZHJbZHIkQ0FVU0UgPT0gMSxdCnByaW50KCJtZWFuIGZpcmUgc2l6ZSBmb3IgaHVtYW4gYW5kIGxpZ2h0bmluZyBmaXJlcyIpCm1lYW4oZHJfaCRHSVNfQUNSRVMpKiAwLjAwNDA0Njg1NjQyMjQKbWVhbihkcl9sJEdJU19BQ1JFUykqIDAuMDA0MDQ2ODU2NDIyNAoKcXVhbnRpbGUoZHJfaCRHSVNfQUNSRVMpKiAwLjAwNDA0Njg1NjQyMjQKcXVhbnRpbGUoZHJfbCRHSVNfQUNSRVMpKiAwLjAwNDA0Njg1NjQyMjQKCmhpc3QuYSA9aGlzdChkciRzcWttLGJyZWFrcyA9YygwLDEwLDI1LDUwLDEwMCwyNTAsMTAwMCwyMDAwKSxwbG90PUYpCgpmciA9IGJhcnBsb3QoaGlzdC5hJGNvdW50cywgYmVzaWRlPVRSVUUseGxhYj1leHByZXNzaW9uKCdGaXJlIHNpemUgKGttJ14yKicpJykseWxhYj0iTnVtYmVyIG9mIGZpcmVzIixjZXgubGFiPTEuNCxjZXguYXhpcyA9IDEuMykKYXhpcygxLGF0PWMoMC4xLDEuMywyLjUsMy43LDQuOSw2LjEsNy4zLDguNSksbGFiZWxzPWMoMCwxMCwyNSw1MCwxMDAsMjUwLDEwMDAsMjAwMCksY2V4LmF4aXMgPSAxLjMpCgpwZGYoZmlsZT0iL1VzZXJzL3N0aWpuaGFudHNvbi9Eb2N1bWVudHMvRG9jdW1lbnRzL2FydGljdWxvcy9lbl9wcm9jZXNvL1ZJSVJTX3Jvcy9TeF9wZGZfZmlyZXNpemUucGRmIix3aWR0aD03LGhlaWdodD02KQpmciA9IGJhcnBsb3QoaGlzdC5hJGNvdW50cywgYmVzaWRlPVRSVUUseGxhYj1leHByZXNzaW9uKCdGaXJlIHNpemUgKGttJ14yKicpJykseWxhYj0iTnVtYmVyIG9mIGZpcmVzIixjZXgubGFiPTEuNCxjZXguYXhpcyA9IDEuMykKYXhpcygxLGF0PWMoMC4xLDEuMywyLjUsMy43LDQuOSw2LjEsNy4zLDguNSksbGFiZWxzPWMoMCwxMCwyNSw1MCwxMDAsMjUwLDEwMDAsMjAwMCksY2V4LmF4aXMgPSAxLjMpCmRldi5vZmYoKQoKYGBgCgoKMSkgZnJhcCAKMikgb25seSBmaXJlIGdyb3d0aCBkYXRhc2V0cwoKLSBwcmVwYXJlIGZpbmFsIGRhdGFzZXQgdG8gb3BlbgpgYGB7cn0KCmRhaWx5X3Jlcz1yZWFkLnRhYmxlKCIvVXNlcnMvc3Rpam5oYW50c29uL0RvY3VtZW50cy9wcm9qZWN0cy9WSUlSU19yb3MvZmluYWxfZGF0YXNldF9WMy50eHQiLGhlYWRlcj1UKQoKcmVzPWFzLmRhdGEuZnJhbWUoZGFpbHlfcmVzKQoKcmVzJG1lYW5fcm9zID1hcy5udW1lcmljKGFzLmNoYXJhY3RlcihyZXMkbWVhbl9yb3MpKQpyZXMkbWF4X3JvcyA9YXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIocmVzJG1heF9yb3MpKQpyZXMkbWVkaWFuOTVfcm9zID1hcy5udW1lcmljKGFzLmNoYXJhY3RlcihyZXMkbWVkaWFuOTVfcm9zKSkKcmVzJGJpID1hcy5udW1lcmljKGFzLmNoYXJhY3RlcihyZXMkYmkpKQpyZXMkZXJjID1hcy5udW1lcmljKGFzLmNoYXJhY3RlcihyZXMkZXJjKSkKcmVzJGV0ciA9YXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIocmVzJGV0cikpCnJlcyRmbTEwMCA9YXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIocmVzJGZtMTAwKSkKcmVzJGZtMTAwMCA9YXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIocmVzJGZtMTAwMCkpCnJlcyRwZXQgPWFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKHJlcyRwZXQpKQpyZXMkcHIgPWFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKHJlcyRwcikpCnJlcyRybWF4ID1hcy5udW1lcmljKGFzLmNoYXJhY3RlcihyZXMkcm1heCkpCnJlcyRybWluID1hcy5udW1lcmljKGFzLmNoYXJhY3RlcihyZXMkcm1pbikpCnJlcyR0aCA9YXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIocmVzJHRoKSkKcmVzJHRtbW4gPWFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKHJlcyR0bW1uKSkKcmVzJHRtbXggPWFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKHJlcyR0bW14KSkKcmVzJHZwZCA9YXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIocmVzJHZwZCkpCiNyZXMkd3MgPWFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKHJlcyR3cykpCnJlcyR2cyA9YXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIocmVzJHZzKSkKcmVzJGdyb3d0aCA9YXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIocmVzJGdyb3d0aCkpCnJlcyR0b3RhbF9hcmVhID1hcy5udW1lcmljKGFzLmNoYXJhY3RlcihyZXMkdG90YWxfYXJlYSkpCnJlcyRtZWFuX2ZycCA9YXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIocmVzJG1lYW5fZnJwKSkKcmVzJGZycF85NSA9YXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIocmVzJGZycF85NSkpCnJlcyRtYXhfbGFuZCA9YXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIocmVzJG1heF9sYW5kKSkKcmVzJG1lYW5fbGFuZCA9YXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIocmVzJG1lYW5fbGFuZCkpCnJlcyRiaW9tYXNzID1hcy5udW1lcmljKGFzLmNoYXJhY3RlcihyZXMkYmlvbWFzcykpCnJlcyR5ZWFyID1hcy5udW1lcmljKGFzLmNoYXJhY3RlcihyZXMkeWVhcikpCnJlcyRtb250aCA9YXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIocmVzJG1vbnRoKSkKcmVzJGRveV9vdXQgPWFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKHJlcyRkb3lfb3V0KSkKCnJlcyA9IHJlc1stMSxdCnJlcyRwZXJfYmEgPSByZXMkZ3Jvd3RoL3JlcyR0b3RhbF9hcmVhCnJlcyRncm93dGhfa20gPXJlcyRncm93dGgvMTAwMDAwMAoKcmVzJGh1bWFuID0gMApyZXMkaHVtYW5bcmVzJGNhdXNlICE9MSAmIHJlcyRjYXVzZSAhPTE0ICYgcmVzJGNhdXNlICE9MTddPTEKcmVzJGh1bWFuW3JlcyRjYXVzZSA9PTEgXT0yCgpyZXMkcm9zX2ttID0gKHJlcyRtZWRpYW45NV9yb3MqMjQpLzEwMDAKcmVzJHJvc19tZWFuX2ttID0gKHJlcyRtZWFuX3JvcyoyNCkvMTAwMAoKYGBgCgojIyMjIyMjIHBsb3QgbWVhbiB2cyBtYXggZmlyZSByYXRlLW9mLXNwcmVhZCAjIyMjIyMjIyMjIyMjIyMjIyMKYGBge3J9CiNzdW1tYXJ5KHJlcykKcGxvdChyZXMkcm9zX2ttLHJlcyRyb3NfbWVhbl9rbSwgeGxhYj0ibWF4aW11bSBmaXJlLXNwcmVhZC1yYXRlIChrbS9kYXkiLHlsYWI9Im1lYW4gZmlyZS1zcHJlYWQtcmF0ZSAoa20vZGF5KSIpCgoKdGlmZigiL1VzZXJzL3N0aWpuaGFudHNvbi9Eb2N1bWVudHMvRG9jdW1lbnRzL2FydGljdWxvcy9lbl9wcm9jZXNvL1ZJSVJTX3Jvcy9tZWFuX3ZzX21heF9yb3NfdjEudGlmIiwgd2lkdGggPSA1LCBoZWlnaHQgPSA1LCB1bml0cyA9ICdpbicsIHJlcyA9IDMwMCkKcGxvdChyZXMkcm9zX2ttLHJlcyRyb3NfbWVhbl9rbSwgeGxpbT1jKDAsMjUpLHlsaW09YygwLDEwKSwgeGxhYj0ibWF4aW11bSBmaXJlIHJhdGUtb2Ytc3ByZWFkIChrbS9kYXkpIix5bGFiPSJtZWFuIGZpcmUgcmF0ZS1vZi1zcHJlYWQgKGttL2RheSkiLCBjZXgubGFiPTEuMyxjZXguYXhpcyA9IDEuMjUpCmRldi5vZmYoKQoKYGBgCgoKCiMjIyMjIyMjIyMjIyBkaWZmZXJlbmNlIGJldHdlZW4gaHVtYW4gYW5kIGxpZ2h0bmlnbiBmaXJlcyAjIyMjIyMjIyMjIyMjIyMjIwoKYGBge3J9Cm1lPTAKbWUxPTAKZGF5cyA9IGMoImRheTEiLCJkYXkyIiwiZGF5MyIsImRheTQiLCJkYXk1IikKZGF5czEgPSBjKCIxIiwiMiIsIjMiLCI0IiwiNSIpCnBybzEgPSByZXNbcmVzJGZpcmVfZGF5ID09IDEgJiByZXMkaHVtYW4gPT0gMSxdCnBybzIgPSByZXNbcmVzJGZpcmVfZGF5ID09IDIgJiByZXMkaHVtYW4gPT0gMSxdCnBybzMgPSByZXNbcmVzJGZpcmVfZGF5ID09IDMgJiByZXMkaHVtYW4gPT0gMSxdCnBybzQgPSByZXNbcmVzJGZpcmVfZGF5ID09IDQgJiByZXMkaHVtYW4gPT0gMSxdCnBybzUgPSByZXNbcmVzJGZpcmVfZGF5ID09IDUgJiByZXMkaHVtYW4gPT0gMSxdCm1lWzFdID1tZWFuKHBybzEkZ3Jvd3RoX2ttLG5hLm9taXQ9VCkKbWVbMl0gPW1lYW4ocHJvMiRncm93dGhfa20sbmEub21pdD1UKQptZVszXSA9bWVhbihwcm8zJGdyb3d0aF9rbSxuYS5vbWl0PVQpCm1lWzRdID1tZWFuKHBybzQkZ3Jvd3RoX2ttLG5hLm9taXQ9VCkKbWVbNV0gPW1lYW4ocHJvNSRncm93dGhfa20sbmEub21pdD1UKQoKcHJvMWggPSByZXNbcmVzJGZpcmVfZGF5ID09IDEgJiByZXMkaHVtYW4gPT0gMixdCnBybzJoID0gcmVzW3JlcyRmaXJlX2RheSA9PSAyICYgcmVzJGh1bWFuID09IDIsXQpwcm8zaCA9IHJlc1tyZXMkZmlyZV9kYXkgPT0gMyAmIHJlcyRodW1hbiA9PSAyLF0KcHJvNGggPSByZXNbcmVzJGZpcmVfZGF5ID09IDQgJiByZXMkaHVtYW4gPT0gMixdCnBybzVoID0gcmVzW3JlcyRmaXJlX2RheSA9PSA1ICYgcmVzJGh1bWFuID09IDIsXQptZTFbMV0gPW1lYW4ocHJvMWgkZ3Jvd3RoX2ttLG5hLm9taXQ9VCkKbWUxWzJdID1tZWFuKHBybzJoJGdyb3d0aF9rbSxuYS5vbWl0PVQpCm1lMVszXSA9bWVhbihwcm8zaCRncm93dGhfa20sbmEub21pdD1UKQptZTFbNF0gPW1lYW4ocHJvNGgkZ3Jvd3RoX2ttLG5hLm9taXQ9VCkKbWUxWzVdID1tZWFuKHBybzVoJGdyb3d0aF9rbSxuYS5vbWl0PVQpCgpib3hwbG90KHBybzEkZ3Jvd3RoX2ttLHBybzIkZ3Jvd3RoX2ttLHBybzMkZ3Jvd3RoX2ttLHBybzQkZ3Jvd3RoX2ttLHBybzUkZ3Jvd3RoX2ttLG5hbWVzPWMoImRheTEiLCJkYXkyIiwiZGF5MyIsImRheTQiLCJkYXk1IikseGxhYj0iIix5bGFiPSJmaXJlIHNpemUgKGttMikiLHlsaW09YygwLDI1MCksIGNleC5sYWI9MS40LGNleC5heGlzID0gMS4zKQoKYm94cGxvdChwcm8xaCRncm93dGhfa20scHJvMmgkZ3Jvd3RoX2ttLHBybzNoJGdyb3d0aF9rbSxwcm80aCRncm93dGhfa20scHJvNWgkZ3Jvd3RoX2ttLG5hbWVzPWMoImRheTEiLCJkYXkyIiwiZGF5MyIsImRheTQiLCJkYXk1IikseGxhYj0iIix5bGFiPSJmaXJlIHNpemUgKGttMikiLHlsaW09YygwLDI1MCksIGNleC5sYWI9MS40LGNleC5heGlzID0gMS4zKQoKdGlmZigiL1VzZXJzL3N0aWpuaGFudHNvbi9Eb2N1bWVudHMvRG9jdW1lbnRzL2FydGljdWxvcy9lbl9wcm9jZXNvL1ZJSVJTX3Jvcy9maWd1cmUxX3YxLnRpZiIsIHdpZHRoID0gMTAsIGhlaWdodCA9IDUsIHVuaXRzID0gJ2luJywgcmVzID0gMzAwKQpwYXIobWZyb3c9YygxLDIpKQpwYXIobWFyPWMoNCwgNCwgMSwwLjEpKQpwYXIobWdwPWMoMi4zLDEsMCkpCmJveHBsb3QocHJvMSRncm93dGhfa20scHJvMiRncm93dGhfa20scHJvMyRncm93dGhfa20scHJvNCRncm93dGhfa20scHJvNSRncm93dGhfa20sbmFtZXM9YygiMSIsIjIiLCIzIiwiNCIsIjUiKSx4bGFiPSJEYXkgc2luY2UgZmlyZSBzdGFydCIseWxhYj0gZXhwcmVzc2lvbignRmlyZSBzaXplIChrbSdeLTEqJyknKSx5bGltPWMoMCwyMDApLCBjZXgubGFiPTEuNCxjZXguYXhpcyA9IDEuMykKYm94cGxvdChwcm8xaCRncm93dGhfa20scHJvMmgkZ3Jvd3RoX2ttLHBybzNoJGdyb3d0aF9rbSxwcm80aCRncm93dGhfa20scHJvNWgkZ3Jvd3RoX2ttLG5hbWVzPWMoIjEiLCIyIiwiMyIsIjQiLCI1IikseGxhYj0iRGF5IHNpbmNlIGZpcmUgc3RhcnQiLHlsYWI9ICIiLHlsaW09YygwLDIwMCksIGNleC5sYWI9MS40LGNleC5heGlzID0gMS4zKQpkZXYub2ZmKCkKCnRpZmYoIi9Vc2Vycy9zdGlqbmhhbnRzb24vRG9jdW1lbnRzL0RvY3VtZW50cy9hcnRpY3Vsb3MvZW5fcHJvY2Vzby9WSUlSU19yb3Mvc3VwX2ZpZ3VyZTFfdjEudGlmIiwgd2lkdGggPSAxMCwgaGVpZ2h0ID0gNSwgdW5pdHMgPSAnaW4nLCByZXMgPSAzMDApCnBhcihtZnJvdz1jKDEsMikpCnBhcihtYXI9Yyg0LCA0LCAxLDAuMSkpCnBhcihtZ3A9YygyLjMsMSwwKSkKYm94cGxvdChwcm8xJGdyb3d0aF9rbSxwcm8yJGdyb3d0aF9rbSxwcm8zJGdyb3d0aF9rbSxwcm80JGdyb3d0aF9rbSxwcm81JGdyb3d0aF9rbSxuYW1lcz1jKCIxIiwiMiIsIjMiLCI0IiwiNSIpLHhsYWI9IkRheSBzaW5jZSBmaXJlIHN0YXJ0Iix5bGFiPSBleHByZXNzaW9uKCdGaXJlIHNpemUgKGttJ14tMSonKScpLHlsaW09YygwLDcwMCksIGNleC5sYWI9MS40LGNleC5heGlzID0gMS4zKQpib3hwbG90KHBybzFoJGdyb3d0aF9rbSxwcm8yaCRncm93dGhfa20scHJvM2gkZ3Jvd3RoX2ttLHBybzRoJGdyb3d0aF9rbSxwcm81aCRncm93dGhfa20sbmFtZXM9YygiMSIsIjIiLCIzIiwiNCIsIjUiKSx4bGFiPSJEYXkgc2luY2UgZmlyZSBzdGFydCIseWxhYj0gIiIseWxpbT1jKDAsNzAwKSwgY2V4LmxhYj0xLjQsY2V4LmF4aXMgPSAxLjMpCmRldi5vZmYoKSAKCnBkZigiL1VzZXJzL3N0aWpuaGFudHNvbi9Eb2N1bWVudHMvRG9jdW1lbnRzL2FydGljdWxvcy9lbl9wcm9jZXNvL1ZJSVJTX3Jvcy9zdXBfZmlnNC9hbGwucGRmIiwgd2lkdGggPSA0LCBoZWlnaHQgPSA1KQpwYXIobWdwPWMoMi4zLDEsMCkpICAKcGxvdChtZSx0eXBlPSJvIiwgeWxpbT1jKDAsMTUwKSx5bGFiPWV4cHJlc3Npb24oImZpcmUgc2l6ZSAoa20iXjIqIikiKSx4bGFiPSIiLCB4YXh0PSduJywgbHR5ID0gMSwgbHdkID0gMixjZXgubGFiPTEuMikKYXhpcyhzaWRlPTEsIGF0PWMoMTo1KSxsYWJlbHM9ZGF5czEpCnBvaW50cyhtZTEsdHlwZT0ibyIsbHR5ID0gMiwgbHdkID0gMikKZGV2Lm9mZigpIAoKdC50ZXN0KGxvZyhwcm8xJGdyb3d0aF9rbSksbG9nKHBybzFoJGdyb3d0aF9rbSkpCnQudGVzdChsb2cocHJvMiRncm93dGhfa20pLGxvZyhwcm8yaCRncm93dGhfa20pKQp0LnRlc3QobG9nKHBybzMkZ3Jvd3RoX2ttKSxsb2cocHJvM2gkZ3Jvd3RoX2ttKSkKdC50ZXN0KGxvZyhwcm80JGdyb3d0aF9rbSksbG9nKHBybzRoJGdyb3d0aF9rbSkpCnQudGVzdChsb2cocHJvNSRncm93dGhfa20pLGxvZyhwcm81aCRncm93dGhfa20pKQoKCmBgYAoKIyMjIyMjIyMjIyMjIyMjIyMjMyBmb3Igd2VzdGVybiBjb3JkaWxsZXJhIGVjb3JlZ2lvbiAgIyMjIyMjIyMjIyMjIyMjIyMjCmBgYHtyfQptZT0wCm1lMT0wCnBybzEgPSByZXNbcmVzJGZpcmVfZGF5ID09IDEgJiByZXMkaHVtYW4gPT0gMSAmIChyZXMkZWNvMSA9PSA2IHwgcmVzJGVjbzEgPT0gNyksXQpwcm8yID0gcmVzW3JlcyRmaXJlX2RheSA9PSAyICYgcmVzJGh1bWFuID09IDEgJiAocmVzJGVjbzEgPT0gNiB8IHJlcyRlY28xID09IDcpLF0KcHJvMyA9IHJlc1tyZXMkZmlyZV9kYXkgPT0gMyAmIHJlcyRodW1hbiA9PSAxICYgKHJlcyRlY28xID09IDYgfCByZXMkZWNvMSA9PSA3KSxdCnBybzQgPSByZXNbcmVzJGZpcmVfZGF5ID09IDQgJiByZXMkaHVtYW4gPT0gMSAmIChyZXMkZWNvMSA9PSA2IHwgcmVzJGVjbzEgPT0gNyksXQpwcm81ID0gcmVzW3JlcyRmaXJlX2RheSA9PSA1ICYgcmVzJGh1bWFuID09IDEgJiAocmVzJGVjbzEgPT0gNiB8IHJlcyRlY28xID09IDcpLF0KCmJveHBsb3QocHJvMSRncm93dGhfa20scHJvMiRncm93dGhfa20scHJvMyRncm93dGhfa20scHJvNCRncm93dGhfa20scHJvNSRncm93dGhfa20sbmFtZXM9YygiZGF5MSIsImRheTIiLCJkYXkzIiwiZGF5NCIsImRheTUiKSx4bGFiPSIiLHlsYWI9ImZpcmUgc2l6ZSAoa20yKSIseWxpbT1jKDAsMjUwKSwgY2V4LmxhYj0xLjQsY2V4LmF4aXMgPSAxLjMpCgpwcm8xaCA9IHJlc1tyZXMkZmlyZV9kYXkgPT0gMSAmIHJlcyRodW1hbiA9PSAyICYgKHJlcyRlY28xID09IDYgfCByZXMkZWNvMSA9PSA3KSxdCnBybzJoID0gcmVzW3JlcyRmaXJlX2RheSA9PSAyICYgcmVzJGh1bWFuID09IDIgJiAocmVzJGVjbzEgPT0gNiB8IHJlcyRlY28xID09IDcpLF0KcHJvM2ggPSByZXNbcmVzJGZpcmVfZGF5ID09IDMgJiByZXMkaHVtYW4gPT0gMiAmIChyZXMkZWNvMSA9PSA2IHwgcmVzJGVjbzEgPT0gNyksXQpwcm80aCA9IHJlc1tyZXMkZmlyZV9kYXkgPT0gNCAmIHJlcyRodW1hbiA9PSAyICYgKHJlcyRlY28xID09IDYgfCByZXMkZWNvMSA9PSA3KSxdCnBybzVoID0gcmVzW3JlcyRmaXJlX2RheSA9PSA1ICYgcmVzJGh1bWFuID09IDIgJiAocmVzJGVjbzEgPT0gNiB8IHJlcyRlY28xID09IDcpLF0KCmJveHBsb3QocHJvMWgkZ3Jvd3RoX2ttLHBybzJoJGdyb3d0aF9rbSxwcm8zaCRncm93dGhfa20scHJvNGgkZ3Jvd3RoX2ttLHBybzVoJGdyb3d0aF9rbSxuYW1lcz1jKCJkYXkxIiwiZGF5MiIsImRheTMiLCJkYXk0IiwiZGF5NSIpLHhsYWI9IiIseWxhYj0iZmlyZSBzaXplIChrbTIpIix5bGltPWMoMCwyNTApLCBjZXgubGFiPTEuNCxjZXguYXhpcyA9IDEuMykKCm1lWzFdID1tZWFuKHBybzEkZ3Jvd3RoX2ttLG5hLm9taXQ9VCkKbWVbMl0gPW1lYW4ocHJvMiRncm93dGhfa20sbmEub21pdD1UKQptZVszXSA9bWVhbihwcm8zJGdyb3d0aF9rbSxuYS5vbWl0PVQpCm1lWzRdID1tZWFuKHBybzQkZ3Jvd3RoX2ttLG5hLm9taXQ9VCkKbWVbNV0gPW1lYW4ocHJvNSRncm93dGhfa20sbmEub21pdD1UKQoKbWUxWzFdID1tZWFuKHBybzFoJGdyb3d0aF9rbSxuYS5ybT1UKQptZTFbMl0gPW1lYW4ocHJvMmgkZ3Jvd3RoX2ttLG5hLnJtPVQpCm1lMVszXSA9bWVhbihwcm8zaCRncm93dGhfa20sbmEucm09VCkKbWUxWzRdID1tZWFuKHBybzRoJGdyb3d0aF9rbSxuYS5ybT1UKQptZTFbNV0gPW1lYW4ocHJvNWgkZ3Jvd3RoX2ttLG5hLnJtPVQpCgoKcGFyKG1ncD1jKDIuMywxLDApKSAgCnBsb3QobWUsdHlwZT0ibyIsIHlsaW09YygwLDE1MCkseWxhYj1leHByZXNzaW9uKCJmaXJlIHNpemUgKGttIl4yKiIpIikseGxhYj0iIiwgeGF4dD0nbicsIGx0eSA9IDEsIGx3ZCA9IDIsY2V4LmxhYj0xLjIpCmF4aXMoc2lkZT0xLCBhdD1jKDE6NSksbGFiZWxzPWRheXMpCnBvaW50cyhtZTEsdHlwZT0ibyIsbHR5ID0gMiwgbHdkID0gMikKCnBkZigiL1VzZXJzL3N0aWpuaGFudHNvbi9Eb2N1bWVudHMvRG9jdW1lbnRzL2FydGljdWxvcy9lbl9wcm9jZXNvL1ZJSVJTX3Jvcy9zdXBfZmlnNC9ub3J0aC5wZGYiLCB3aWR0aCA9IDQsIGhlaWdodCA9IDUpCnBhcihtZ3A9YygyLjMsMSwwKSkgIApwbG90KG1lLHR5cGU9Im8iLCB5bGltPWMoMCwxNTApLHlsYWI9ZXhwcmVzc2lvbigiZmlyZSBzaXplIChrbSJeMioiKSIpLHhsYWI9IiIsIHhheHQ9J24nLCBsdHkgPSAxLCBsd2QgPSAyLGNleC5sYWI9MS4yKQpheGlzKHNpZGU9MSwgYXQ9YygxOjUpLGxhYmVscz1kYXlzMSkKcG9pbnRzKG1lMSx0eXBlPSJvIixsdHkgPSAyLCBsd2QgPSAyKQpkZXYub2ZmKCkgCgoKdC50ZXN0KGxvZyhwcm8xJGdyb3d0aF9rbSksbG9nKHBybzFoJGdyb3d0aF9rbSkpCnQudGVzdChsb2cocHJvMiRncm93dGhfa20pLGxvZyhwcm8yaCRncm93dGhfa20pKQp0LnRlc3QobG9nKHBybzMkZ3Jvd3RoX2ttKSxsb2cocHJvM2gkZ3Jvd3RoX2ttKSkKdC50ZXN0KGxvZyhwcm80JGdyb3d0aF9rbSksbG9nKHBybzRoJGdyb3d0aF9rbSkpCnQudGVzdChsb2cocHJvNSRncm93dGhfa20pLGxvZyhwcm81aCRncm93dGhfa20pKQoKbWVhbihwcm8xJGdyb3d0aF9rbSxuYS5vbWl0PVQpCm1lYW4ocHJvMWgkZ3Jvd3RoX2ttLG5hLnJtPVQpCgpgYGAKCiMjIyMjIyMjIyMjIyMjIyMjIyBmb3IgbWVkaXRlcmFuZWFuIGNhbGlmb3JuaWEgICMjIyMjIyMjIyMjIyMjIyMjIwoKYGBge3J9CnBybzEgPSByZXNbcmVzJGZpcmVfZGF5ID09IDEgJiByZXMkaHVtYW4gPT0gMSAmIChyZXMkZWNvMSA9PSAxMSksXQpwcm8yID0gcmVzW3JlcyRmaXJlX2RheSA9PSAyICYgcmVzJGh1bWFuID09IDEgJiAocmVzJGVjbzEgPT0gMTEpLF0KcHJvMyA9IHJlc1tyZXMkZmlyZV9kYXkgPT0gMyAmIHJlcyRodW1hbiA9PSAxICYgKHJlcyRlY28xID09IDExKSxdCnBybzQgPSByZXNbcmVzJGZpcmVfZGF5ID09IDQgJiByZXMkaHVtYW4gPT0gMSAmIChyZXMkZWNvMSA9PSAxMSksXQpwcm81ID0gcmVzW3JlcyRmaXJlX2RheSA9PSA1ICYgcmVzJGh1bWFuID09IDEgJiAocmVzJGVjbzEgPT0gMTEpLF0KCmJveHBsb3QocHJvMSRncm93dGhfa20scHJvMiRncm93dGhfa20scHJvMyRncm93dGhfa20scHJvNCRncm93dGhfa20scHJvNSRncm93dGhfa20sbmFtZXM9YygiZGF5MSIsImRheTIiLCJkYXkzIiwiZGF5NCIsImRheTUiKSx4bGFiPSIiLHlsYWI9ImZpcmUgc2l6ZSAoa20yKSIseWxpbT1jKDAsMzAwKSwgY2V4LmxhYj0xLjQsY2V4LmF4aXMgPSAxLjMpCgpwcm8xaCA9IHJlc1tyZXMkZmlyZV9kYXkgPT0gMSAmIHJlcyRodW1hbiA9PSAyICYgKHJlcyRlY28xID09IDExKSxdCnBybzJoID0gcmVzW3JlcyRmaXJlX2RheSA9PSAyICYgcmVzJGh1bWFuID09IDIgJiAocmVzJGVjbzEgPT0gMTEpLF0KcHJvM2ggPSByZXNbcmVzJGZpcmVfZGF5ID09IDMgJiByZXMkaHVtYW4gPT0gMiAmIChyZXMkZWNvMSA9PSAxMSksXQpwcm80aCA9IHJlc1tyZXMkZmlyZV9kYXkgPT0gNCAmIHJlcyRodW1hbiA9PSAyICYgKHJlcyRlY28xID09IDExKSxdCnBybzVoID0gcmVzW3JlcyRmaXJlX2RheSA9PSA1ICYgcmVzJGh1bWFuID09IDIgJiAocmVzJGVjbzEgPT0gMTEpLF0KCmJveHBsb3QocHJvMWgkZ3Jvd3RoX2ttLHBybzJoJGdyb3d0aF9rbSxwcm8zaCRncm93dGhfa20scHJvNGgkZ3Jvd3RoX2ttLHBybzVoJGdyb3d0aF9rbSxuYW1lcz1jKCJkYXkxIiwiZGF5MiIsImRheTMiLCJkYXk0IiwiZGF5NSIpLHhsYWI9IiIseWxhYj0iZmlyZSBzaXplIChrbTIpIix5bGltPWMoMCwzMDApLCBjZXgubGFiPTEuNCxjZXguYXhpcyA9IDEuMykKCm1lWzFdID1tZWFuKHBybzEkZ3Jvd3RoX2ttLG5hLm9taXQ9VCkKbWVbMl0gPW1lYW4ocHJvMiRncm93dGhfa20sbmEub21pdD1UKQptZVszXSA9bWVhbihwcm8zJGdyb3d0aF9rbSxuYS5vbWl0PVQpCm1lWzRdID1tZWFuKHBybzQkZ3Jvd3RoX2ttLG5hLm9taXQ9VCkKbWVbNV0gPW1lYW4ocHJvNSRncm93dGhfa20sbmEub21pdD1UKQoKbWUxWzFdID1tZWFuKHBybzFoJGdyb3d0aF9rbSxuYS5ybT1UKQptZTFbMl0gPW1lYW4ocHJvMmgkZ3Jvd3RoX2ttLG5hLnJtPVQpCm1lMVszXSA9bWVhbihwcm8zaCRncm93dGhfa20sbmEucm09VCkKbWUxWzRdID1tZWFuKHBybzRoJGdyb3d0aF9rbSxuYS5ybT1UKQptZTFbNV0gPW1lYW4ocHJvNWgkZ3Jvd3RoX2ttLG5hLnJtPVQpCgoKcGFyKG1ncD1jKDIuMywxLDApKSAgCnBsb3QobWUsdHlwZT0ibyIsIHlsaW09YygwLDE1MCkseWxhYj1leHByZXNzaW9uKCJmaXJlIHNpemUgKGttIl4yKiIpIikseGxhYj0iIiwgeGF4dD0nbicsIGx0eSA9IDEsIGx3ZCA9IDIsY2V4LmxhYj0xLjIpCmF4aXMoc2lkZT0xLCBhdD1jKDE6NSksbGFiZWxzPWRheXMpCnBvaW50cyhtZTEsdHlwZT0ibyIsbHR5ID0gMiwgbHdkID0gMikKCnBkZigiL1VzZXJzL3N0aWpuaGFudHNvbi9Eb2N1bWVudHMvRG9jdW1lbnRzL2FydGljdWxvcy9lbl9wcm9jZXNvL1ZJSVJTX3Jvcy9zdXBfZmlnNC9tZWQucGRmIiwgd2lkdGggPSA0LCBoZWlnaHQgPSA1KQpwYXIobWdwPWMoMi4zLDEsMCkpICAKcGxvdChtZSx0eXBlPSJvIiwgeWxpbT1jKDAsMTUwKSx5bGFiPWV4cHJlc3Npb24oImZpcmUgc2l6ZSAoa20iXjIqIikiKSx4bGFiPSIiLCB4YXh0PSduJywgbHR5ID0gMSwgbHdkID0gMixjZXgubGFiPTEuMikKYXhpcyhzaWRlPTEsIGF0PWMoMTo1KSxsYWJlbHM9ZGF5czEpCnBvaW50cyhtZTEsdHlwZT0ibyIsbHR5ID0gMiwgbHdkID0gMikKZGV2Lm9mZigpIAoKCmBgYAojIyMjIyMjIyMjIyMjIyMjIyMgZm9yIGRpZmZlcmVuY2UgaW4gYXV0dW1uICAjIyMjIyMjIyMjIyMjIyMjIyMKYGBge3J9CnBybzEgPSByZXNbcmVzJGZpcmVfZGF5ID09IDEgJiByZXMkaHVtYW4gPT0gMSAmIHJlcyRtb250aCA+OCxdCnBybzIgPSByZXNbcmVzJGZpcmVfZGF5ID09IDIgJiByZXMkaHVtYW4gPT0gMSAmIHJlcyRtb250aCA+OCxdCnBybzMgPSByZXNbcmVzJGZpcmVfZGF5ID09IDMgJiByZXMkaHVtYW4gPT0gMSAmIHJlcyRtb250aCA+OCxdCnBybzQgPSByZXNbcmVzJGZpcmVfZGF5ID09IDQgJiByZXMkaHVtYW4gPT0gMSAmIHJlcyRtb250aCA+OCxdCnBybzUgPSByZXNbcmVzJGZpcmVfZGF5ID09IDUgJiByZXMkaHVtYW4gPT0gMSAmIHJlcyRtb250aCA+OCxdCgpib3hwbG90KHBybzEkZ3Jvd3RoX2ttLHBybzIkZ3Jvd3RoX2ttLHBybzMkZ3Jvd3RoX2ttLHBybzQkZ3Jvd3RoX2ttLHBybzUkZ3Jvd3RoX2ttLG5hbWVzPWMoImRheTEiLCJkYXkyIiwiZGF5MyIsImRheTQiLCJkYXk1IikseGxhYj0iIix5bGFiPSJmaXJlIHNpemUgKGttMikiLHlsaW09YygwLDMwMCksIGNleC5sYWI9MS40LGNleC5heGlzID0gMS4zKQoKcHJvMWggPSByZXNbcmVzJGZpcmVfZGF5ID09IDEgJiByZXMkaHVtYW4gPT0gMiAmIHJlcyRtb250aCA+OCxdCnBybzJoID0gcmVzW3JlcyRmaXJlX2RheSA9PSAyICYgcmVzJGh1bWFuID09IDIgJiByZXMkbW9udGggPjgsXQpwcm8zaCA9IHJlc1tyZXMkZmlyZV9kYXkgPT0gMyAmIHJlcyRodW1hbiA9PSAyICYgcmVzJG1vbnRoID44LF0KcHJvNGggPSByZXNbcmVzJGZpcmVfZGF5ID09IDQgJiByZXMkaHVtYW4gPT0gMiAmIHJlcyRtb250aCA+OCxdCnBybzVoID0gcmVzW3JlcyRmaXJlX2RheSA9PSA1ICYgcmVzJGh1bWFuID09IDIgJiByZXMkbW9udGggPjgsXQoKYm94cGxvdChwcm8xaCRncm93dGhfa20scHJvMmgkZ3Jvd3RoX2ttLHBybzNoJGdyb3d0aF9rbSxwcm80aCRncm93dGhfa20scHJvNWgkZ3Jvd3RoX2ttLG5hbWVzPWMoImRheTEiLCJkYXkyIiwiZGF5MyIsImRheTQiLCJkYXk1IikseGxhYj0iIix5bGFiPSJmaXJlIHNpemUgKGttMikiLHlsaW09YygwLDMwMCksIGNleC5sYWI9MS40LGNleC5heGlzID0gMS4zKQoKbWVbMV0gPW1lYW4ocHJvMSRncm93dGhfa20sbmEub21pdD1UKQptZVsyXSA9bWVhbihwcm8yJGdyb3d0aF9rbSxuYS5vbWl0PVQpCm1lWzNdID1tZWFuKHBybzMkZ3Jvd3RoX2ttLG5hLm9taXQ9VCkKbWVbNF0gPW1lYW4ocHJvNCRncm93dGhfa20sbmEub21pdD1UKQptZVs1XSA9bWVhbihwcm81JGdyb3d0aF9rbSxuYS5vbWl0PVQpCgptZTFbMV0gPW1lYW4ocHJvMWgkZ3Jvd3RoX2ttLG5hLnJtPVQpCm1lMVsyXSA9bWVhbihwcm8yaCRncm93dGhfa20sbmEucm09VCkKbWUxWzNdID1tZWFuKHBybzNoJGdyb3d0aF9rbSxuYS5ybT1UKQptZTFbNF0gPW1lYW4ocHJvNGgkZ3Jvd3RoX2ttLG5hLnJtPVQpCm1lMVs1XSA9bWVhbihwcm81aCRncm93dGhfa20sbmEucm09VCkKCgpwYXIobWdwPWMoMi4zLDEsMCkpICAKcGxvdChtZSx0eXBlPSJvIiwgeWxpbT1jKDAsMTUwKSx5bGFiPWV4cHJlc3Npb24oImZpcmUgc2l6ZSAoa20iXjIqIikiKSx4bGFiPSIiLCB4YXh0PSduJywgbHR5ID0gMSwgbHdkID0gMixjZXgubGFiPTEuMikKYXhpcyhzaWRlPTEsIGF0PWMoMTo1KSxsYWJlbHM9ZGF5cykKcG9pbnRzKG1lMSx0eXBlPSJvIixsdHkgPSAyLCBsd2QgPSAyKQoKcGRmKCIvVXNlcnMvc3Rpam5oYW50c29uL0RvY3VtZW50cy9Eb2N1bWVudHMvYXJ0aWN1bG9zL2VuX3Byb2Nlc28vVklJUlNfcm9zL3N1cF9maWc0L2F1dHVtbi5wZGYiLCB3aWR0aCA9IDQsIGhlaWdodCA9IDUpCnBhcihtZ3A9YygyLjMsMSwwKSkgIApwbG90KG1lLHR5cGU9Im8iLCB5bGltPWMoMCwyNTApLHlsYWI9ZXhwcmVzc2lvbigiZmlyZSBzaXplIChrbSJeMioiKSIpLHhsYWI9IiIsIHhheHQ9J24nLCBsdHkgPSAxLCBsd2QgPSAyLGNleC5sYWI9MS4yKQpheGlzKHNpZGU9MSwgYXQ9YygxOjUpLGxhYmVscz1kYXlzMSkKcG9pbnRzKG1lMSx0eXBlPSJvIixsdHkgPSAyLCBsd2QgPSAyKQpkZXYub2ZmKCkgCgoKYGBgCgojIyMjIyMjIyMjIyMjIyMjIyMgZm9yIGRpZmZlcmVuY2UgaW4gc3VtbWVyICAjIyMjIyMjIyMjIyMjIyMjIyMKCmBgYHtyfQpwcm8xID0gcmVzW3JlcyRmaXJlX2RheSA9PSAxICYgcmVzJGh1bWFuID09IDEgJiByZXMkbW9udGggPD04ICxdCnBybzIgPSByZXNbcmVzJGZpcmVfZGF5ID09IDIgJiByZXMkaHVtYW4gPT0gMSAmIHJlcyRtb250aCA8PTgsXQpwcm8zID0gcmVzW3JlcyRmaXJlX2RheSA9PSAzICYgcmVzJGh1bWFuID09IDEgJiByZXMkbW9udGggPD04LF0KcHJvNCA9IHJlc1tyZXMkZmlyZV9kYXkgPT0gNCAmIHJlcyRodW1hbiA9PSAxICYgcmVzJG1vbnRoIDw9OCxdCnBybzUgPSByZXNbcmVzJGZpcmVfZGF5ID09IDUgJiByZXMkaHVtYW4gPT0gMSAmIHJlcyRtb250aCA8PTgsXQoKYm94cGxvdChwcm8xJGdyb3d0aF9rbSxwcm8yJGdyb3d0aF9rbSxwcm8zJGdyb3d0aF9rbSxwcm80JGdyb3d0aF9rbSxwcm81JGdyb3d0aF9rbSxuYW1lcz1jKCJkYXkxIiwiZGF5MiIsImRheTMiLCJkYXk0IiwiZGF5NSIpLHhsYWI9IiIseWxhYj0iZmlyZSBzaXplIChrbTIpIix5bGltPWMoMCwzMDApLCBjZXgubGFiPTEuNCxjZXguYXhpcyA9IDEuMykKCnBybzFoID0gcmVzW3JlcyRmaXJlX2RheSA9PSAxICYgcmVzJGh1bWFuID09IDIgJiByZXMkbW9udGggPD04LF0KcHJvMmggPSByZXNbcmVzJGZpcmVfZGF5ID09IDIgJiByZXMkaHVtYW4gPT0gMiAmIHJlcyRtb250aCA8PTgsXQpwcm8zaCA9IHJlc1tyZXMkZmlyZV9kYXkgPT0gMyAmIHJlcyRodW1hbiA9PSAyICYgcmVzJG1vbnRoIDw9OCxdCnBybzRoID0gcmVzW3JlcyRmaXJlX2RheSA9PSA0ICYgcmVzJGh1bWFuID09IDIgJiByZXMkbW9udGggPD04LF0KcHJvNWggPSByZXNbcmVzJGZpcmVfZGF5ID09IDUgJiByZXMkaHVtYW4gPT0gMiAmIHJlcyRtb250aCA8PTgsXQoKYm94cGxvdChwcm8xaCRncm93dGhfa20scHJvMmgkZ3Jvd3RoX2ttLHBybzNoJGdyb3d0aF9rbSxwcm80aCRncm93dGhfa20scHJvNWgkZ3Jvd3RoX2ttLG5hbWVzPWMoImRheTEiLCJkYXkyIiwiZGF5MyIsImRheTQiLCJkYXk1IikseGxhYj0iIix5bGFiPSJmaXJlIHNpemUgKGttMikiLHlsaW09YygwLDMwMCksIGNleC5sYWI9MS40LGNleC5heGlzID0gMS4zKQoKbWVbMV0gPW1lYW4ocHJvMSRncm93dGhfa20sbmEub21pdD1UKQptZVsyXSA9bWVhbihwcm8yJGdyb3d0aF9rbSxuYS5vbWl0PVQpCm1lWzNdID1tZWFuKHBybzMkZ3Jvd3RoX2ttLG5hLm9taXQ9VCkKbWVbNF0gPW1lYW4ocHJvNCRncm93dGhfa20sbmEub21pdD1UKQptZVs1XSA9bWVhbihwcm81JGdyb3d0aF9rbSxuYS5vbWl0PVQpCgptZTFbMV0gPW1lYW4ocHJvMWgkZ3Jvd3RoX2ttLG5hLnJtPVQpCm1lMVsyXSA9bWVhbihwcm8yaCRncm93dGhfa20sbmEucm09VCkKbWUxWzNdID1tZWFuKHBybzNoJGdyb3d0aF9rbSxuYS5ybT1UKQptZTFbNF0gPW1lYW4ocHJvNGgkZ3Jvd3RoX2ttLG5hLnJtPVQpCm1lMVs1XSA9bWVhbihwcm81aCRncm93dGhfa20sbmEucm09VCkKCgpwYXIobWdwPWMoMi4zLDEsMCkpICAKcGxvdChtZSx0eXBlPSJvIiwgeWxpbT1jKDAsMTUwKSx5bGFiPWV4cHJlc3Npb24oImZpcmUgc2l6ZSAoa20iXjIqIikiKSx4bGFiPSIiLCB4YXh0PSduJywgbHR5ID0gMSwgbHdkID0gMixjZXgubGFiPTEuMikKYXhpcyhzaWRlPTEsIGF0PWMoMTo1KSxsYWJlbHM9ZGF5cykKcG9pbnRzKG1lMSx0eXBlPSJvIixsdHkgPSAyLCBsd2QgPSAyKQoKcGRmKCIvVXNlcnMvc3Rpam5oYW50c29uL0RvY3VtZW50cy9Eb2N1bWVudHMvYXJ0aWN1bG9zL2VuX3Byb2Nlc28vVklJUlNfcm9zL3N1cF9maWc0L3N1bW1lci5wZGYiLCB3aWR0aCA9IDQsIGhlaWdodCA9IDUpCnBhcihtZ3A9YygyLjMsMSwwKSkgIApwbG90KG1lLHR5cGU9Im8iLCB5bGltPWMoMCwxNTApLHlsYWI9ZXhwcmVzc2lvbigiZmlyZSBzaXplIChrbSJeMioiKSIpLHhsYWI9IiIsIHhheHQ9J24nLCBsdHkgPSAxLCBsd2QgPSAyLGNleC5sYWI9MS4yKQpheGlzKHNpZGU9MSwgYXQ9YygxOjUpLGxhYmVscz1kYXlzMSkKcG9pbnRzKG1lMSx0eXBlPSJvIixsdHkgPSAyLCBsd2QgPSAyKQpkZXYub2ZmKCkgCgpgYGAKCiMjIyMjIyMjIyMjIyMjIyMjIyBmb3IgZGlmZmVyZW5jZSBpbiBzdW1tZXIgaW4gd2VzdGVybiBjb3JkaWxsZXJhICAjIyMjIyMjIyMjIyMjIyMjIyMKCmBgYHtyfQpwcm8xID0gcmVzW3JlcyRmaXJlX2RheSA9PSAxICYgcmVzJGh1bWFuID09IDEgJiAoIHJlcyRtb250aCA8PTggJiByZXMkbW9udGggPjUgKSAmIChyZXMkZWNvMSA9PSA2IHwgcmVzJGVjbzEgPT0gNyksXQpwcm8yID0gcmVzW3JlcyRmaXJlX2RheSA9PSAyICYgcmVzJGh1bWFuID09IDEgJiAoIHJlcyRtb250aCA8PTggJiByZXMkbW9udGggPjUgKSAmIChyZXMkZWNvMSA9PSA2IHwgcmVzJGVjbzEgPT0gNyksXQpwcm8zID0gcmVzW3JlcyRmaXJlX2RheSA9PSAzICYgcmVzJGh1bWFuID09IDEgJiAoIHJlcyRtb250aCA8PTggJiByZXMkbW9udGggPjUgKSAmIChyZXMkZWNvMSA9PSA2IHwgcmVzJGVjbzEgPT0gNyksXQpwcm80ID0gcmVzW3JlcyRmaXJlX2RheSA9PSA0ICYgcmVzJGh1bWFuID09IDEgJiAoIHJlcyRtb250aCA8PTggJiByZXMkbW9udGggPjUgKSAmIChyZXMkZWNvMSA9PSA2IHwgcmVzJGVjbzEgPT0gNyksXQpwcm81ID0gcmVzW3JlcyRmaXJlX2RheSA9PSA1ICYgcmVzJGh1bWFuID09IDEgJiAoIHJlcyRtb250aCA8PTggJiByZXMkbW9udGggPjUgKSAmIChyZXMkZWNvMSA9PSA2IHwgcmVzJGVjbzEgPT0gNyksXQoKYm94cGxvdChwcm8xJGdyb3d0aF9rbSxwcm8yJGdyb3d0aF9rbSxwcm8zJGdyb3d0aF9rbSxwcm80JGdyb3d0aF9rbSxwcm81JGdyb3d0aF9rbSxuYW1lcz1jKCJkYXkxIiwiZGF5MiIsImRheTMiLCJkYXk0IiwiZGF5NSIpLHhsYWI9IiIseWxhYj0iZmlyZSBzaXplIChrbTIpIix5bGltPWMoMCwzMDApLCBjZXgubGFiPTEuNCxjZXguYXhpcyA9IDEuMykKCnBybzFoID0gcmVzW3JlcyRmaXJlX2RheSA9PSAxICYgcmVzJGh1bWFuID09IDIgJiAoIHJlcyRtb250aCA8PTggJiByZXMkbW9udGggPjUgKSAmIChyZXMkZWNvMSA9PSA2IHwgcmVzJGVjbzEgPT0gNyksXQpwcm8yaCA9IHJlc1tyZXMkZmlyZV9kYXkgPT0gMiAmIHJlcyRodW1hbiA9PSAyICYgKCByZXMkbW9udGggPD04ICYgcmVzJG1vbnRoID41ICkgJiAocmVzJGVjbzEgPT0gNiB8IHJlcyRlY28xID09IDcpLF0KcHJvM2ggPSByZXNbcmVzJGZpcmVfZGF5ID09IDMgJiByZXMkaHVtYW4gPT0gMiAmICggcmVzJG1vbnRoIDw9OCAmIHJlcyRtb250aCA+NSApICYgKHJlcyRlY28xID09IDYgfCByZXMkZWNvMSA9PSA3KSxdCnBybzRoID0gcmVzW3JlcyRmaXJlX2RheSA9PSA0ICYgcmVzJGh1bWFuID09IDIgJiAoIHJlcyRtb250aCA8PTggJiByZXMkbW9udGggPjUgKSAmIChyZXMkZWNvMSA9PSA2IHwgcmVzJGVjbzEgPT0gNyksXQpwcm81aCA9IHJlc1tyZXMkZmlyZV9kYXkgPT0gNSAmIHJlcyRodW1hbiA9PSAyICYgKCByZXMkbW9udGggPD04ICYgcmVzJG1vbnRoID41ICkgJiAocmVzJGVjbzEgPT0gNiB8IHJlcyRlY28xID09IDcpLF0KCmJveHBsb3QocHJvMWgkZ3Jvd3RoX2ttLHBybzJoJGdyb3d0aF9rbSxwcm8zaCRncm93dGhfa20scHJvNGgkZ3Jvd3RoX2ttLHBybzVoJGdyb3d0aF9rbSxuYW1lcz1jKCJkYXkxIiwiZGF5MiIsImRheTMiLCJkYXk0IiwiZGF5NSIpLHhsYWI9IiIseWxhYj0iZmlyZSBzaXplIChrbTIpIix5bGltPWMoMCwzMDApLCBjZXgubGFiPTEuNCxjZXguYXhpcyA9IDEuMykKCnQudGVzdChsb2cocHJvMSRncm93dGhfa20pLGxvZyhwcm8xaCRncm93dGhfa20pKQp0LnRlc3QobG9nKHBybzIkZ3Jvd3RoX2ttKSxsb2cocHJvMmgkZ3Jvd3RoX2ttKSkKdC50ZXN0KGxvZyhwcm8zJGdyb3d0aF9rbSksbG9nKHBybzNoJGdyb3d0aF9rbSkpCnQudGVzdChsb2cocHJvNCRncm93dGhfa20pLGxvZyhwcm80aCRncm93dGhfa20pKQp0LnRlc3QobG9nKHBybzUkZ3Jvd3RoX2ttKSxsb2cocHJvNWgkZ3Jvd3RoX2ttKSkKCm1lWzFdID1tZWFuKHBybzEkZ3Jvd3RoX2ttLG5hLm9taXQ9VCkKbWVbMl0gPW1lYW4ocHJvMiRncm93dGhfa20sbmEub21pdD1UKQptZVszXSA9bWVhbihwcm8zJGdyb3d0aF9rbSxuYS5vbWl0PVQpCm1lWzRdID1tZWFuKHBybzQkZ3Jvd3RoX2ttLG5hLm9taXQ9VCkKbWVbNV0gPW1lYW4ocHJvNSRncm93dGhfa20sbmEub21pdD1UKQoKbWUxWzFdID1tZWFuKHBybzFoJGdyb3d0aF9rbSxuYS5ybT1UKQptZTFbMl0gPW1lYW4ocHJvMmgkZ3Jvd3RoX2ttLG5hLnJtPVQpCm1lMVszXSA9bWVhbihwcm8zaCRncm93dGhfa20sbmEucm09VCkKbWUxWzRdID1tZWFuKHBybzRoJGdyb3d0aF9rbSxuYS5ybT1UKQptZTFbNV0gPW1lYW4ocHJvNWgkZ3Jvd3RoX2ttLG5hLnJtPVQpCgpwYXIobWdwPWMoMi4zLDEsMCkpICAKcGxvdChtZSx0eXBlPSJvIiwgeWxpbT1jKDAsMTUwKSx5bGFiPWV4cHJlc3Npb24oImZpcmUgc2l6ZSAoa20iXjIqIikiKSx4bGFiPSIiLCB4YXh0PSduJywgbHR5ID0gMSwgbHdkID0gMixjZXgubGFiPTEuMikKYXhpcyhzaWRlPTEsIGF0PWMoMTo1KSxsYWJlbHM9ZGF5cykKcG9pbnRzKG1lMSx0eXBlPSJvIixsdHkgPSAyLCBsd2QgPSAyKQoKcGRmKCIvVXNlcnMvc3Rpam5oYW50c29uL0RvY3VtZW50cy9Eb2N1bWVudHMvYXJ0aWN1bG9zL2VuX3Byb2Nlc28vVklJUlNfcm9zL3N1cF9maWc0L25vcnRoX3N1bW1lci5wZGYiLCB3aWR0aCA9IDQsIGhlaWdodCA9IDUpCnBhcihtZ3A9YygyLjMsMSwwKSkgIApwbG90KG1lLHR5cGU9Im8iLCB5bGltPWMoMCwxNTApLHlsYWI9ZXhwcmVzc2lvbigiZmlyZSBzaXplIChrbSJeMioiKSIpLHhsYWI9IiIsIHhheHQ9J24nLCBsdHkgPSAxLCBsd2QgPSAyLGNleC5sYWI9MS4yKQpheGlzKHNpZGU9MSwgYXQ9YygxOjUpLGxhYmVscz1kYXlzMSkKcG9pbnRzKG1lMSx0eXBlPSJvIixsdHkgPSAyLCBsd2QgPSAyKQpkZXYub2ZmKCkgCgoKYGBgCgojIyMjIyMjIyMjIyMjIyMjIyMgZm9yIGRpZmZlcmVuY2UgaW4gYXV0dW1uIGluIHdlc3Rlcm4gY29yZGlsbGVyYSAgIyMjIyMjIyMjIyMjIyMjIyMjCmBgYHtyfQpwcm8xID0gcmVzW3JlcyRmaXJlX2RheSA9PSAxICYgcmVzJGh1bWFuID09IDEgJiAoIHJlcyRtb250aCA+OCApICYgKHJlcyRlY28xID09IDYgfCByZXMkZWNvMSA9PSA3KSxdCnBybzIgPSByZXNbcmVzJGZpcmVfZGF5ID09IDIgJiByZXMkaHVtYW4gPT0gMSAmICggcmVzJG1vbnRoID44ICkgJiAocmVzJGVjbzEgPT0gNiB8IHJlcyRlY28xID09IDcpLF0KcHJvMyA9IHJlc1tyZXMkZmlyZV9kYXkgPT0gMyAmIHJlcyRodW1hbiA9PSAxICYgKCByZXMkbW9udGggPjggKSAmIChyZXMkZWNvMSA9PSA2IHwgcmVzJGVjbzEgPT0gNyksXQpwcm80ID0gcmVzW3JlcyRmaXJlX2RheSA9PSA0ICYgcmVzJGh1bWFuID09IDEgJiAoIHJlcyRtb250aCA+OCApICYgKHJlcyRlY28xID09IDYgfCByZXMkZWNvMSA9PSA3KSxdCnBybzUgPSByZXNbcmVzJGZpcmVfZGF5ID09IDUgJiByZXMkaHVtYW4gPT0gMSAmICggcmVzJG1vbnRoID44ICkgJiAocmVzJGVjbzEgPT0gNiB8IHJlcyRlY28xID09IDcpLF0KCmJveHBsb3QocHJvMSRncm93dGhfa20scHJvMiRncm93dGhfa20scHJvMyRncm93dGhfa20scHJvNCRncm93dGhfa20scHJvNSRncm93dGhfa20sbmFtZXM9YygiZGF5MSIsImRheTIiLCJkYXkzIiwiZGF5NCIsImRheTUiKSx4bGFiPSIiLHlsYWI9ImZpcmUgc2l6ZSAoa20yKSIseWxpbT1jKDAsMzAwKSwgY2V4LmxhYj0xLjQsY2V4LmF4aXMgPSAxLjMpCgpwcm8xaCA9IHJlc1tyZXMkZmlyZV9kYXkgPT0gMSAmIHJlcyRodW1hbiA9PSAyICYgKCByZXMkbW9udGggPjggKSAmIChyZXMkZWNvMSA9PSA2IHwgcmVzJGVjbzEgPT0gNyksXQpwcm8yaCA9IHJlc1tyZXMkZmlyZV9kYXkgPT0gMiAmIHJlcyRodW1hbiA9PSAyICYgKCByZXMkbW9udGggPjggKSAmIChyZXMkZWNvMSA9PSA2IHwgcmVzJGVjbzEgPT0gNyksXQpwcm8zaCA9IHJlc1tyZXMkZmlyZV9kYXkgPT0gMyAmIHJlcyRodW1hbiA9PSAyICYgKCByZXMkbW9udGggPjggKSAmIChyZXMkZWNvMSA9PSA2IHwgcmVzJGVjbzEgPT0gNyksXQpwcm80aCA9IHJlc1tyZXMkZmlyZV9kYXkgPT0gNCAmIHJlcyRodW1hbiA9PSAyICYgKHJlcyRtb250aCA+OCApICYgKHJlcyRlY28xID09IDYgfCByZXMkZWNvMSA9PSA3KSxdCnBybzVoID0gcmVzW3JlcyRmaXJlX2RheSA9PSA1ICYgcmVzJGh1bWFuID09IDIgJiAoIHJlcyRtb250aCA+OCApICYgKHJlcyRlY28xID09IDYgfCByZXMkZWNvMSA9PSA3KSxdCgpib3hwbG90KHBybzFoJGdyb3d0aF9rbSxwcm8yaCRncm93dGhfa20scHJvM2gkZ3Jvd3RoX2ttLHBybzRoJGdyb3d0aF9rbSxwcm81aCRncm93dGhfa20sbmFtZXM9YygiZGF5MSIsImRheTIiLCJkYXkzIiwiZGF5NCIsImRheTUiKSx4bGFiPSIiLHlsYWI9ImZpcmUgc2l6ZSAoa20yKSIseWxpbT1jKDAsMzAwKSwgY2V4LmxhYj0xLjQsY2V4LmF4aXMgPSAxLjMpCgptZVsxXSA9bWVhbihwcm8xJGdyb3d0aF9rbSxuYS5vbWl0PVQpCm1lWzJdID1tZWFuKHBybzIkZ3Jvd3RoX2ttLG5hLm9taXQ9VCkKbWVbM10gPW1lYW4ocHJvMyRncm93dGhfa20sbmEub21pdD1UKQptZVs0XSA9bWVhbihwcm80JGdyb3d0aF9rbSxuYS5vbWl0PVQpCm1lWzVdID1tZWFuKHBybzUkZ3Jvd3RoX2ttLG5hLm9taXQ9VCkKCm1lMVsxXSA9bWVhbihwcm8xaCRncm93dGhfa20sbmEucm09VCkKbWUxWzJdID1tZWFuKHBybzJoJGdyb3d0aF9rbSxuYS5ybT1UKQptZTFbM10gPW1lYW4ocHJvM2gkZ3Jvd3RoX2ttLG5hLnJtPVQpCm1lMVs0XSA9bWVhbihwcm80aCRncm93dGhfa20sbmEucm09VCkKbWUxWzVdID1tZWFuKHBybzVoJGdyb3d0aF9rbSxuYS5ybT1UKQoKcGFyKG1ncD1jKDIuMywxLDApKSAgCnBsb3QobWUsdHlwZT0ibyIsIHlsaW09YygwLDE1MCkseWxhYj1leHByZXNzaW9uKCJmaXJlIHNpemUgKGttIl4yKiIpIikseGxhYj0iIiwgeGF4dD0nbicsIGx0eSA9IDEsIGx3ZCA9IDIsY2V4LmxhYj0xLjIpCmF4aXMoc2lkZT0xLCBhdD1jKDE6NSksbGFiZWxzPWRheXMpCnBvaW50cyhtZTEsdHlwZT0ibyIsbHR5ID0gMiwgbHdkID0gMikKCnBkZigiL1VzZXJzL3N0aWpuaGFudHNvbi9Eb2N1bWVudHMvRG9jdW1lbnRzL2FydGljdWxvcy9lbl9wcm9jZXNvL1ZJSVJTX3Jvcy9zdXBfZmlnNC9ub3J0aF9hdXR1bW4ucGRmIiwgd2lkdGggPSA0LCBoZWlnaHQgPSA1KQpwYXIobWdwPWMoMi4zLDEsMCkpICAKcGxvdChtZSx0eXBlPSJvIiwgeWxpbT1jKDAsMjUwKSx5bGFiPWV4cHJlc3Npb24oImZpcmUgc2l6ZSAoa20iXjIqIikiKSx4bGFiPSIiLCB4YXh0PSduJywgbHR5ID0gMSwgbHdkID0gMixjZXgubGFiPTEuMikKYXhpcyhzaWRlPTEsIGF0PWMoMTo1KSxsYWJlbHM9ZGF5czEpCnBvaW50cyhtZTEsdHlwZT0ibyIsbHR5ID0gMiwgbHdkID0gMikKZGV2Lm9mZigpIAoKCmBgYAojIyMjIyMjIyMjIyMjIyMjIyMgZm9yIGRpZmZlcmVuY2UgaW4gc3VtbWVyIGluIG1lZGl0ZXJlYW5lYW4gICMjIyMjIyMjIyMjIyMjIyMjIwoKYGBge3J9CnBybzEgPSByZXNbcmVzJGZpcmVfZGF5ID09IDEgJiByZXMkaHVtYW4gPT0gMSAmICggcmVzJG1vbnRoIDw9OCAmIHJlcyRtb250aCA+NSApICYgKHJlcyRlY28xID09IDExKSxdCnBybzIgPSByZXNbcmVzJGZpcmVfZGF5ID09IDIgJiByZXMkaHVtYW4gPT0gMSAmICggcmVzJG1vbnRoIDw9OCAmIHJlcyRtb250aCA+NSApICYgKHJlcyRlY28xID09IDExKSxdCnBybzMgPSByZXNbcmVzJGZpcmVfZGF5ID09IDMgJiByZXMkaHVtYW4gPT0gMSAmICggcmVzJG1vbnRoIDw9OCAmIHJlcyRtb250aCA+NSApICYgKHJlcyRlY28xID09IDExKSxdCnBybzQgPSByZXNbcmVzJGZpcmVfZGF5ID09IDQgJiByZXMkaHVtYW4gPT0gMSAmICggcmVzJG1vbnRoIDw9OCAmIHJlcyRtb250aCA+NSApICYgKHJlcyRlY28xID09IDExKSxdCnBybzUgPSByZXNbcmVzJGZpcmVfZGF5ID09IDUgJiByZXMkaHVtYW4gPT0gMSAmICggcmVzJG1vbnRoIDw9OCAmIHJlcyRtb250aCA+NSApICYgKHJlcyRlY28xID09IDExKSxdCgpib3hwbG90KHBybzEkZ3Jvd3RoX2ttLHBybzIkZ3Jvd3RoX2ttLHBybzMkZ3Jvd3RoX2ttLHBybzQkZ3Jvd3RoX2ttLHBybzUkZ3Jvd3RoX2ttLG5hbWVzPWMoImRheTEiLCJkYXkyIiwiZGF5MyIsImRheTQiLCJkYXk1IikseGxhYj0iIix5bGFiPSJmaXJlIHNpemUgKGttMikiLHlsaW09YygwLDMwMCksIGNleC5sYWI9MS40LGNleC5heGlzID0gMS4zKQoKcHJvMWggPSByZXNbcmVzJGZpcmVfZGF5ID09IDEgJiByZXMkaHVtYW4gPT0gMiAmICggcmVzJG1vbnRoIDw9OCAmIHJlcyRtb250aCA+NSApICYgKHJlcyRlY28xID09IDExKSxdCnBybzJoID0gcmVzW3JlcyRmaXJlX2RheSA9PSAyICYgcmVzJGh1bWFuID09IDIgJiAoIHJlcyRtb250aCA8PTggJiByZXMkbW9udGggPjUgKSAmIChyZXMkZWNvMSA9PSAxMSksXQpwcm8zaCA9IHJlc1tyZXMkZmlyZV9kYXkgPT0gMyAmIHJlcyRodW1hbiA9PSAyICYgKCByZXMkbW9udGggPD04ICYgcmVzJG1vbnRoID41ICkgJiAocmVzJGVjbzEgPT0gMTEpLF0KcHJvNGggPSByZXNbcmVzJGZpcmVfZGF5ID09IDQgJiByZXMkaHVtYW4gPT0gMiAmICggcmVzJG1vbnRoIDw9OCAmIHJlcyRtb250aCA+NSApICYgKHJlcyRlY28xID09IDExKSxdCnBybzVoID0gcmVzW3JlcyRmaXJlX2RheSA9PSA1ICYgcmVzJGh1bWFuID09IDIgJiAoIHJlcyRtb250aCA8PTggJiByZXMkbW9udGggPjUgKSAmIChyZXMkZWNvMSA9PSAxMSksXQoKYm94cGxvdChwcm8xaCRncm93dGhfa20scHJvMmgkZ3Jvd3RoX2ttLHBybzNoJGdyb3d0aF9rbSxwcm80aCRncm93dGhfa20scHJvNWgkZ3Jvd3RoX2ttLG5hbWVzPWMoImRheTEiLCJkYXkyIiwiZGF5MyIsImRheTQiLCJkYXk1IikseGxhYj0iIix5bGFiPSJmaXJlIHNpemUgKGttMikiLHlsaW09YygwLDMwMCksIGNleC5sYWI9MS40LGNleC5heGlzID0gMS4zKQoKI3QudGVzdChsb2cocHJvMSRncm93dGhfa20pLGxvZyhwcm8xaCRncm93dGhfa20pKQojdC50ZXN0KGxvZyhwcm8yJGdyb3d0aF9rbSksbG9nKHBybzJoJGdyb3d0aF9rbSkpCiN0LnRlc3QobG9nKHBybzMkZ3Jvd3RoX2ttKSxsb2cocHJvM2gkZ3Jvd3RoX2ttKSkKI3QudGVzdChsb2cocHJvNCRncm93dGhfa20pLGxvZyhwcm80aCRncm93dGhfa20pKQojdC50ZXN0KGxvZyhwcm81JGdyb3d0aF9rbSksbG9nKHBybzVoJGdyb3d0aF9rbSkpCgptZVsxXSA9bWVhbihwcm8xJGdyb3d0aF9rbSxuYS5vbWl0PVQpCm1lWzJdID1tZWFuKHBybzIkZ3Jvd3RoX2ttLG5hLm9taXQ9VCkKbWVbM10gPW1lYW4ocHJvMyRncm93dGhfa20sbmEub21pdD1UKQptZVs0XSA9bWVhbihwcm80JGdyb3d0aF9rbSxuYS5vbWl0PVQpCm1lWzVdID1tZWFuKHBybzUkZ3Jvd3RoX2ttLG5hLm9taXQ9VCkKCm1lMVsxXSA9bWVhbihwcm8xaCRncm93dGhfa20sbmEucm09VCkKbWUxWzJdID1tZWFuKHBybzJoJGdyb3d0aF9rbSxuYS5ybT1UKQptZTFbM10gPW1lYW4ocHJvM2gkZ3Jvd3RoX2ttLG5hLnJtPVQpCm1lMVs0XSA9bWVhbihwcm80aCRncm93dGhfa20sbmEucm09VCkKbWUxWzVdID1tZWFuKHBybzVoJGdyb3d0aF9rbSxuYS5ybT1UKQoKcGFyKG1ncD1jKDIuMywxLDApKSAgCnBsb3QobWUsdHlwZT0ibyIsIHlsaW09YygwLDE1MCkseWxhYj1leHByZXNzaW9uKCJmaXJlIHNpemUgKGttIl4yKiIpIikseGxhYj0iIiwgeGF4dD0nbicsIGx0eSA9IDEsIGx3ZCA9IDIsY2V4LmxhYj0xLjIpCmF4aXMoc2lkZT0xLCBhdD1jKDE6NSksbGFiZWxzPWRheXMpCnBvaW50cyhtZTEsdHlwZT0ibyIsbHR5ID0gMiwgbHdkID0gMikKCnBkZigiL1VzZXJzL3N0aWpuaGFudHNvbi9Eb2N1bWVudHMvRG9jdW1lbnRzL2FydGljdWxvcy9lbl9wcm9jZXNvL1ZJSVJTX3Jvcy9zdXBfZmlnNC9tZWRfc3VtbWVyLnBkZiIsIHdpZHRoID0gNCwgaGVpZ2h0ID0gNSkKcGFyKG1ncD1jKDIuMywxLDApKSAgCnBsb3QobWUsdHlwZT0ibyIsIHlsaW09YygwLDE1MCkseWxhYj1leHByZXNzaW9uKCJmaXJlIHNpemUgKGttIl4yKiIpIikseGxhYj0iIiwgeGF4dD0nbicsIGx0eSA9IDEsIGx3ZCA9IDIsY2V4LmxhYj0xLjIpCmF4aXMoc2lkZT0xLCBhdD1jKDE6NSksbGFiZWxzPWRheXMxKQpwb2ludHMobWUxLHR5cGU9Im8iLGx0eSA9IDIsIGx3ZCA9IDIpCmRldi5vZmYoKSAKCgpgYGAKCmAKIyMjIyMjIyMjIyMjIyMjIyMjIGZvciBkaWZmZXJlbmNlIGluIGF1dHVtbiBpbiBtZWRpdGVyYW5lYW4gICMjIyMjIyMjIyMjIyMjIyMjIwpgYGB7cn0KcHJvMSA9IHJlc1tyZXMkZmlyZV9kYXkgPT0gMSAmIHJlcyRodW1hbiA9PSAxICYgKCByZXMkbW9udGggPjggKSAmIChyZXMkZWNvMSA9PSAxMSksXQpwcm8yID0gcmVzW3JlcyRmaXJlX2RheSA9PSAyICYgcmVzJGh1bWFuID09IDEgJiAoIHJlcyRtb250aCA+OCApICYgKHJlcyRlY28xID09IDExKSxdCnBybzMgPSByZXNbcmVzJGZpcmVfZGF5ID09IDMgJiByZXMkaHVtYW4gPT0gMSAmICggcmVzJG1vbnRoID44ICkgJiAocmVzJGVjbzEgPT0gMTEpLF0KcHJvNCA9IHJlc1tyZXMkZmlyZV9kYXkgPT0gNCAmIHJlcyRodW1hbiA9PSAxICYgKCByZXMkbW9udGggPjggKSAmIChyZXMkZWNvMSA9PSAxMSksXQpwcm81ID0gcmVzW3JlcyRmaXJlX2RheSA9PSA1ICYgcmVzJGh1bWFuID09IDEgJiAoIHJlcyRtb250aCA+OCApICYgKHJlcyRlY28xID09IDExKSxdCgpib3hwbG90KHBybzEkZ3Jvd3RoX2ttLHBybzIkZ3Jvd3RoX2ttLHBybzMkZ3Jvd3RoX2ttLHBybzQkZ3Jvd3RoX2ttLHBybzUkZ3Jvd3RoX2ttLG5hbWVzPWMoImRheTEiLCJkYXkyIiwiZGF5MyIsImRheTQiLCJkYXk1IikseGxhYj0iIix5bGFiPSJmaXJlIHNpemUgKGttMikiLHlsaW09YygwLDMwMCksIGNleC5sYWI9MS40LGNleC5heGlzID0gMS4zKQoKcHJvMWggPSByZXNbcmVzJGZpcmVfZGF5ID09IDEgJiByZXMkaHVtYW4gPT0gMiAmICggcmVzJG1vbnRoID44ICkgJiAocmVzJGVjbzEgPT0gMTEpLF0KcHJvMmggPSByZXNbcmVzJGZpcmVfZGF5ID09IDIgJiByZXMkaHVtYW4gPT0gMiAmICggcmVzJG1vbnRoID44ICkgJiAocmVzJGVjbzEgPT0gMTEpLF0KcHJvM2ggPSByZXNbcmVzJGZpcmVfZGF5ID09IDMgJiByZXMkaHVtYW4gPT0gMiAmICggcmVzJG1vbnRoID44ICkgJiAocmVzJGVjbzEgPT0gMTEpLF0KcHJvNGggPSByZXNbcmVzJGZpcmVfZGF5ID09IDQgJiByZXMkaHVtYW4gPT0gMiAmICggcmVzJG1vbnRoID44ICkgJiAocmVzJGVjbzEgPT0gMTEpLF0KcHJvNWggPSByZXNbcmVzJGZpcmVfZGF5ID09IDUgJiByZXMkaHVtYW4gPT0gMiAmICggcmVzJG1vbnRoID44ICkgJiAocmVzJGVjbzEgPT0gMTEpLF0KCmJveHBsb3QocHJvMWgkZ3Jvd3RoX2ttLHBybzJoJGdyb3d0aF9rbSxwcm8zaCRncm93dGhfa20scHJvNGgkZ3Jvd3RoX2ttLHBybzVoJGdyb3d0aF9rbSxuYW1lcz1jKCJkYXkxIiwiZGF5MiIsImRheTMiLCJkYXk0IiwiZGF5NSIpLHhsYWI9IiIseWxhYj0iZmlyZSBzaXplIChrbTIpIix5bGltPWMoMCwzMDApLCBjZXgubGFiPTEuNCxjZXguYXhpcyA9IDEuMykKCm1lWzFdID1tZWFuKHBybzEkZ3Jvd3RoX2ttLG5hLm9taXQ9VCkKbWVbMl0gPW1lYW4ocHJvMiRncm93dGhfa20sbmEub21pdD1UKQptZVszXSA9bWVhbihwcm8zJGdyb3d0aF9rbSxuYS5vbWl0PVQpCm1lWzRdID1tZWFuKHBybzQkZ3Jvd3RoX2ttLG5hLm9taXQ9VCkKbWVbNV0gPW1lYW4ocHJvNSRncm93dGhfa20sbmEub21pdD1UKQoKbWUxWzFdID1tZWFuKHBybzFoJGdyb3d0aF9rbSxuYS5ybT1UKQptZTFbMl0gPW1lYW4ocHJvMmgkZ3Jvd3RoX2ttLG5hLnJtPVQpCm1lMVszXSA9bWVhbihwcm8zaCRncm93dGhfa20sbmEucm09VCkKbWUxWzRdID1tZWFuKHBybzRoJGdyb3d0aF9rbSxuYS5ybT1UKQptZTFbNV0gPW1lYW4ocHJvNWgkZ3Jvd3RoX2ttLG5hLnJtPVQpCgpwYXIobWdwPWMoMi4zLDEsMCkpICAKcGxvdChtZSx0eXBlPSJvIiwgeWxpbT1jKDAsMTUwKSx5bGFiPWV4cHJlc3Npb24oImZpcmUgc2l6ZSAoa20iXjIqIikiKSx4bGFiPSIiLCB4YXh0PSduJywgbHR5ID0gMSwgbHdkID0gMixjZXgubGFiPTEuMikKYXhpcyhzaWRlPTEsIGF0PWMoMTo1KSxsYWJlbHM9ZGF5cykKcG9pbnRzKG1lMSx0eXBlPSJvIixsdHkgPSAyLCBsd2QgPSAyKQoKcGRmKCIvVXNlcnMvc3Rpam5oYW50c29uL0RvY3VtZW50cy9Eb2N1bWVudHMvYXJ0aWN1bG9zL2VuX3Byb2Nlc28vVklJUlNfcm9zL3N1cF9maWc0L21lZF9hdXR1bW4ucGRmIiwgd2lkdGggPSA0LCBoZWlnaHQgPSA1KQpwYXIobWdwPWMoMi4zLDEsMCkpICAKcGxvdChtZSx0eXBlPSJvIiwgeWxpbT1jKDAsNDAwKSx5bGFiPWV4cHJlc3Npb24oImZpcmUgc2l6ZSAoa20iXjIqIikiKSx4bGFiPSIiLCB4YXh0PSduJywgbHR5ID0gMSwgbHdkID0gMixjZXgubGFiPTEuMikKYXhpcyhzaWRlPTEsIGF0PWMoMTo1KSxsYWJlbHM9ZGF5czEpCnBvaW50cyhtZTEsdHlwZT0ibyIsbHR5ID0gMiwgbHdkID0gMikKZGV2Lm9mZigpIAoKCmBgYAoKIyMjIyMjIyMjIyMjIGhvdyBtYW55IGRheXMgZG9lcyBpdCB0YWtlIHRvIHJlYWNoIDc1JSBidXJudCBhcmVhICMjIyMjIyMjIyMjIyMjIyMjCgpgYGB7cn0KcmVzNzUgPSByZXNbcmVzJHBlcl9iYSA+IDAuNzUsXQojcGVha19kYXkgPSBhcy5kYXRhLmZyYW1lKGFnZ3JlZ2F0ZShyZXM3NSRmaXJlX2RheSwgYnkgPSBsaXN0KHJlczc1JGZpcmVuYW1lLHJlczc1JGNhdXNlKSwgbWluKSkKI3BlYWtfZGF5PXN1YnNldChwZWFrX2RheSx4IDwgNTUpCiNoaSA9IGhpc3QocGVha19kYXkkeCxwcm9iID1GLCBicmVha3M9IGMoMDo1NCksIHhsaW09YygwLDU1KSwgeWxhYj0ibnVtYmVyIG9mIGZpcmVzIiwgeGxhYj0iZGF5cyIsIGNleC5sYWI9MS40LGNleC5heGlzPTEuMykKCm91dDEgPSBzdWJzZXQocmVzNzUsY2F1c2UgPT0gMSApICAgIzE9bGlnaHRuaW5nOyAxND11bmtub3duOyA3PWFyc29uCm91dDIgPSBzdWJzZXQocmVzNzUsY2F1c2UgIT0xICYgY2F1c2UgIT0gMTQgKQpwZWFrX2RheTEgPSBhcy5kYXRhLmZyYW1lKGFnZ3JlZ2F0ZShvdXQxJGZpcmVfZGF5LCBieSA9IGxpc3Qob3V0MSRmaXJlbmFtZSksIG1pbikpCnBlYWtfZGF5MiA9IGFzLmRhdGEuZnJhbWUoYWdncmVnYXRlKG91dDIkZmlyZV9kYXksIGJ5ID0gbGlzdChvdXQyJGZpcmVuYW1lKSwgbWluKSkKcGVhaz1hcy5kYXRhLmZyYW1lKGFnZ3JlZ2F0ZShyZXM3NSRmaXJlX2RheSwgYnkgPSBsaXN0KHJlczc1JGZpcmVuYW1lKSwgbWluKSkKcXVhbnRpbGUocGVha19kYXkxJHgsMC41MCx0eXBlPTMpIApxdWFudGlsZShwZWFrX2RheTIkeCwwLjUwLHR5cGU9MykgCgpwZWFrX2RheTE9c3Vic2V0KHBlYWtfZGF5MSx4IDwgNTYpCnBlYWtfZGF5Mj1zdWJzZXQocGVha19kYXkyLHggPCA1NikKaGlzdC5hID1oaXN0KHBlYWtfZGF5MSR4LGJyZWFrcyA9YygwOjU1KSxwbG90PUYpCmhpc3QuYiA9aGlzdChwZWFrX2RheTIkeCxicmVha3MgPWMoMDo1NSkscGxvdD1GKQpmZyA9IHJiaW5kKGhpc3QuYSRjb3VudHMsaGlzdC5iJGNvdW50cykKCmZyID0gYmFycGxvdChmZyx4bGFiPSJEYXlzIGFmdGVyIGlnbml0aW9uIix5bGFiPSJOdW1iZXIgb2YgZmlyZXMiLGNleC5sYWI9MS40LGNleC5heGlzID0gMS4zLCB4bGltPWMoMSw2NSksIHlsaW09YygwLDMwKSkKYXhpcygxLGMoMC43LDUuNSwxMS41LDE3LjUsMjMuNSwyOS41LDM1LjUsNDEuNSw0Ny41LDUzLjUsNTkuNSw2NS41KSxsYWJlbHM9YygxLDUsMTAsMTUsMjAsMjUsMzAsMzUsNDAsNDUsNTAsNTUpLGNleC5heGlzID0gMS4zKQpsZWdlbmQoInRvcHJpZ2h0IixsZWdlbmQgPSBjKCJodW1hbiIsImxpZ2h0bmluZyIpLCBmaWxsPWMoImdyZXkiLCJibGFjayIpLGNleD0xLjQsYnR5ID0gIm4iKQoKcGRmKGZpbGU9Ii9Vc2Vycy9zdGlqbmhhbnRzb24vRG9jdW1lbnRzL0RvY3VtZW50cy9hcnRpY3Vsb3MvZW5fcHJvY2Vzby9WSUlSU19yb3MvdGltZV90b19yZWFjaDc1LnBkZiIsd2lkdGg9NyxoZWlnaHQ9NSkKZnIgPSBiYXJwbG90KGZnLHhsYWI9IkRheXMgYWZ0ZXIgaWduaXRpb24iLHlsYWI9Ik51bWJlciBvZiBmaXJlcyIsY2V4LmxhYj0xLjQsY2V4LmF4aXMgPSAxLjMsIHhsaW09YygxLDY1KSwgeWxpbT1jKDAsMzApKQpheGlzKDEsYygwLjcsNS41LDExLjUsMTcuNSwyMy41LDI5LjUsMzUuNSw0MS41LDQ3LjUsNTMuNSw1OS41LDY1LjUpLGxhYmVscz1jKDEsNSwxMCwxNSwyMCwyNSwzMCwzNSw0MCw0NSw1MCw1NSksY2V4LmF4aXMgPSAxLjMpCmxlZ2VuZCgidG9wcmlnaHQiLGxlZ2VuZCA9IGMoImh1bWFuIiwibGlnaHRuaW5nIiksIGZpbGw9YygiZ3JleSIsImJsYWNrIiksY2V4PTEuNCxidHkgPSAibiIpCmRldi5vZmYoKQoKIyMjIyMjIyMgIG1lZGl0ZXJhbmVhbiAgIyMjIyMjIyMjIyMKb3V0MSA9IHN1YnNldChyZXM3NSxjYXVzZSA9PSAxICYgcmVzNzUkZWNvMSA9PSAxMSkgICAjMT1saWdodG5pbmc7IDE0PXVua25vd247IDc9YXJzb24Kb3V0MiA9IHN1YnNldChyZXM3NSxjYXVzZSAhPTEgJiBjYXVzZSAhPSAxNCAmIHJlczc1JGVjbzEgPT0gMTEpCnBlYWtfZGF5MSA9IGFzLmRhdGEuZnJhbWUoYWdncmVnYXRlKG91dDEkZmlyZV9kYXksIGJ5ID0gbGlzdChvdXQxJGZpcmVuYW1lKSwgbWluKSkKcGVha19kYXkyID0gYXMuZGF0YS5mcmFtZShhZ2dyZWdhdGUob3V0MiRmaXJlX2RheSwgYnkgPSBsaXN0KG91dDIkZmlyZW5hbWUpLCBtaW4pKQoKcGVha19kYXkxPXN1YnNldChwZWFrX2RheTEseCA8IDU2KQpwZWFrX2RheTI9c3Vic2V0KHBlYWtfZGF5Mix4IDwgNTYpCmhpc3QuYSA9aGlzdChwZWFrX2RheTEkeCxicmVha3MgPWMoMDo1NSkscGxvdD1GKQpoaXN0LmIgPWhpc3QocGVha19kYXkyJHgsYnJlYWtzID1jKDA6NTUpLHBsb3Q9RikKZmcgPSByYmluZChoaXN0LmEkY291bnRzLGhpc3QuYiRjb3VudHMpCgpwZGYoZmlsZT0iL1VzZXJzL3N0aWpuaGFudHNvbi9Eb2N1bWVudHMvRG9jdW1lbnRzL2FydGljdWxvcy9lbl9wcm9jZXNvL1ZJSVJTX3Jvcy9zdXBfZmlnNV90aW1lNzUvbWVkLnBkZiIsd2lkdGg9NyxoZWlnaHQ9NSkKZnIgPSBiYXJwbG90KGZnLHhsYWI9IkRheXMgYWZ0ZXIgaWduaXRpb24iLHlsYWI9Ik51bWJlciBvZiBmaXJlcyIsY2V4LmxhYj0xLjQsY2V4LmF4aXMgPSAxLjMsIHhsaW09YygxLDY1KSwgeWxpbT1jKDAsMTUpKQpheGlzKDEsYygwLjcsNS41LDExLjUsMTcuNSwyMy41LDI5LjUsMzUuNSw0MS41LDQ3LjUsNTMuNSw1OS41LDY1LjUpLGxhYmVscz1jKDEsNSwxMCwxNSwyMCwyNSwzMCwzNSw0MCw0NSw1MCw1NSksY2V4LmF4aXMgPSAxLjMpCmxlZ2VuZCgidG9wcmlnaHQiLGxlZ2VuZCA9IGMoImh1bWFuIiwibGlnaHRuaW5nIiksIGZpbGw9YygiZ3JleSIsImJsYWNrIiksY2V4PTEuNCxidHkgPSAibiIpCmRldi5vZmYoKQoKIyMjIyMjIyMgIG5vcnRoIGNhbCAgIyMjIyMjIyMjIyMKb3V0MSA9IHN1YnNldChyZXM3NSxjYXVzZSA9PSAxICAmIChyZXM3NSRlY28xID09IDYgfCByZXM3NSRlY28xID09IDcpKSAgICMxPWxpZ2h0bmluZzsgMTQ9dW5rbm93bjsgNz1hcnNvbgpvdXQyID0gc3Vic2V0KHJlczc1LGNhdXNlICE9MSAmIGNhdXNlICE9IDE0ICAmIChyZXM3NSRlY28xID09IDYgfCByZXM3NSRlY28xID09IDcpKQpwZWFrX2RheTEgPSBhcy5kYXRhLmZyYW1lKGFnZ3JlZ2F0ZShvdXQxJGZpcmVfZGF5LCBieSA9IGxpc3Qob3V0MSRmaXJlbmFtZSksIG1pbikpCnBlYWtfZGF5MiA9IGFzLmRhdGEuZnJhbWUoYWdncmVnYXRlKG91dDIkZmlyZV9kYXksIGJ5ID0gbGlzdChvdXQyJGZpcmVuYW1lKSwgbWluKSkKCnBlYWtfZGF5MT1zdWJzZXQocGVha19kYXkxLHggPCA1NikKcGVha19kYXkyPXN1YnNldChwZWFrX2RheTIseCA8IDU2KQpoaXN0LmEgPWhpc3QocGVha19kYXkxJHgsYnJlYWtzID1jKDA6NTUpLHBsb3Q9RikKaGlzdC5iID1oaXN0KHBlYWtfZGF5MiR4LGJyZWFrcyA9YygwOjU1KSxwbG90PUYpCmZnID0gcmJpbmQoaGlzdC5hJGNvdW50cyxoaXN0LmIkY291bnRzKQoKcGRmKGZpbGU9Ii9Vc2Vycy9zdGlqbmhhbnRzb24vRG9jdW1lbnRzL0RvY3VtZW50cy9hcnRpY3Vsb3MvZW5fcHJvY2Vzby9WSUlSU19yb3Mvc3VwX2ZpZzVfdGltZTc1L25vcnRoLnBkZiIsd2lkdGg9NyxoZWlnaHQ9NSkKZnIgPSBiYXJwbG90KGZnLHhsYWI9IkRheXMgYWZ0ZXIgaWduaXRpb24iLHlsYWI9Ik51bWJlciBvZiBmaXJlcyIsY2V4LmxhYj0xLjQsY2V4LmF4aXMgPSAxLjMsIHhsaW09YygxLDY1KSwgeWxpbT1jKDAsMTUpKQpheGlzKDEsYygwLjcsNS41LDExLjUsMTcuNSwyMy41LDI5LjUsMzUuNSw0MS41LDQ3LjUsNTMuNSw1OS41LDY1LjUpLGxhYmVscz1jKDEsNSwxMCwxNSwyMCwyNSwzMCwzNSw0MCw0NSw1MCw1NSksY2V4LmF4aXMgPSAxLjMpCmxlZ2VuZCgidG9wcmlnaHQiLGxlZ2VuZCA9IGMoImh1bWFuIiwibGlnaHRuaW5nIiksIGZpbGw9YygiZ3JleSIsImJsYWNrIiksY2V4PTEuNCxidHkgPSAibiIpCmRldi5vZmYoKQoKIyMjIyMjIyMgIG1lZGl0ZXJhbmVhbiAgU1VNTUVSICMjIyMjIyMjIyMjCm91dDEgPSBzdWJzZXQocmVzNzUsY2F1c2UgPT0gMSAmIHJlczc1JGVjbzEgPT0gMTEgJiAoIHJlczc1JG1vbnRoIDw9OCAmIHJlczc1JG1vbnRoID41ICkpICAgIzE9bGlnaHRuaW5nOyAxND11bmtub3duOyA3PWFyc29uCm91dDIgPSBzdWJzZXQocmVzNzUsY2F1c2UgIT0xICYgY2F1c2UgIT0gMTQgJiByZXM3NSRlY28xID09IDExICYgKCByZXM3NSRtb250aCA8PTggJiByZXM3NSRtb250aCA+NSApKQpwZWFrX2RheTEgPSBhcy5kYXRhLmZyYW1lKGFnZ3JlZ2F0ZShvdXQxJGZpcmVfZGF5LCBieSA9IGxpc3Qob3V0MSRmaXJlbmFtZSksIG1pbikpCnBlYWtfZGF5MiA9IGFzLmRhdGEuZnJhbWUoYWdncmVnYXRlKG91dDIkZmlyZV9kYXksIGJ5ID0gbGlzdChvdXQyJGZpcmVuYW1lKSwgbWluKSkKCnBlYWtfZGF5MT1zdWJzZXQocGVha19kYXkxLHggPCA1NikKcGVha19kYXkyPXN1YnNldChwZWFrX2RheTIseCA8IDU2KQpoaXN0LmEgPWhpc3QocGVha19kYXkxJHgsYnJlYWtzID1jKDA6NTUpLHBsb3Q9RikKaGlzdC5iID1oaXN0KHBlYWtfZGF5MiR4LGJyZWFrcyA9YygwOjU1KSxwbG90PUYpCmZnID0gcmJpbmQoaGlzdC5hJGNvdW50cyxoaXN0LmIkY291bnRzKQoKcGRmKGZpbGU9Ii9Vc2Vycy9zdGlqbmhhbnRzb24vRG9jdW1lbnRzL0RvY3VtZW50cy9hcnRpY3Vsb3MvZW5fcHJvY2Vzby9WSUlSU19yb3Mvc3VwX2ZpZzVfdGltZTc1L21lZF9zdW1tZXIucGRmIix3aWR0aD03LGhlaWdodD01KQpmciA9IGJhcnBsb3QoZmcseGxhYj0iRGF5cyBhZnRlciBpZ25pdGlvbiIseWxhYj0iTnVtYmVyIG9mIGZpcmVzIixjZXgubGFiPTEuNCxjZXguYXhpcyA9IDEuMywgeGxpbT1jKDEsNjUpLCB5bGltPWMoMCwxMCkpCmF4aXMoMSxjKDAuNyw1LjUsMTEuNSwxNy41LDIzLjUsMjkuNSwzNS41LDQxLjUsNDcuNSw1My41LDU5LjUsNjUuNSksbGFiZWxzPWMoMSw1LDEwLDE1LDIwLDI1LDMwLDM1LDQwLDQ1LDUwLDU1KSxjZXguYXhpcyA9IDEuMykKbGVnZW5kKCJ0b3ByaWdodCIsbGVnZW5kID0gYygiaHVtYW4iLCJsaWdodG5pbmciKSwgZmlsbD1jKCJncmV5IiwiYmxhY2siKSxjZXg9MS40LGJ0eSA9ICJuIikKZGV2Lm9mZigpCgojIyMjIyMjIyAgbm9ydGggY2FsICBzdW1tZXIgIyMjIyMjIyMjIyMKb3V0MSA9IHN1YnNldChyZXM3NSxjYXVzZSA9PSAxICAmIChyZXM3NSRlY28xID09IDYgfCByZXM3NSRlY28xID09IDcpJiAoIHJlczc1JG1vbnRoIDw9OCAmIHJlczc1JG1vbnRoID41ICkpICAgIzE9bGlnaHRuaW5nOyAxND11bmtub3duOyA3PWFyc29uCm91dDIgPSBzdWJzZXQocmVzNzUsY2F1c2UgIT0xICYgY2F1c2UgIT0gMTQgICYgKHJlczc1JGVjbzEgPT0gNiB8IHJlczc1JGVjbzEgPT0gNykmICggcmVzNzUkbW9udGggPD04ICYgcmVzNzUkbW9udGggPjUgKSkKcGVha19kYXkxID0gYXMuZGF0YS5mcmFtZShhZ2dyZWdhdGUob3V0MSRmaXJlX2RheSwgYnkgPSBsaXN0KG91dDEkZmlyZW5hbWUpLCBtaW4pKQpwZWFrX2RheTIgPSBhcy5kYXRhLmZyYW1lKGFnZ3JlZ2F0ZShvdXQyJGZpcmVfZGF5LCBieSA9IGxpc3Qob3V0MiRmaXJlbmFtZSksIG1pbikpCgpwZWFrX2RheTE9c3Vic2V0KHBlYWtfZGF5MSx4IDwgNTYpCnBlYWtfZGF5Mj1zdWJzZXQocGVha19kYXkyLHggPCA1NikKaGlzdC5hID1oaXN0KHBlYWtfZGF5MSR4LGJyZWFrcyA9YygwOjU1KSxwbG90PUYpCmhpc3QuYiA9aGlzdChwZWFrX2RheTIkeCxicmVha3MgPWMoMDo1NSkscGxvdD1GKQpmZyA9IHJiaW5kKGhpc3QuYSRjb3VudHMsaGlzdC5iJGNvdW50cykKCnBkZihmaWxlPSIvVXNlcnMvc3Rpam5oYW50c29uL0RvY3VtZW50cy9Eb2N1bWVudHMvYXJ0aWN1bG9zL2VuX3Byb2Nlc28vVklJUlNfcm9zL3N1cF9maWc1X3RpbWU3NS9ub3J0aF9zdW1tZXIucGRmIix3aWR0aD03LGhlaWdodD01KQpmciA9IGJhcnBsb3QoZmcseGxhYj0iRGF5cyBhZnRlciBpZ25pdGlvbiIseWxhYj0iTnVtYmVyIG9mIGZpcmVzIixjZXgubGFiPTEuNCxjZXguYXhpcyA9IDEuMywgeGxpbT1jKDEsNjUpLCB5bGltPWMoMCwxMikpCmF4aXMoMSxjKDAuNyw1LjUsMTEuNSwxNy41LDIzLjUsMjkuNSwzNS41LDQxLjUsNDcuNSw1My41LDU5LjUsNjUuNSksbGFiZWxzPWMoMSw1LDEwLDE1LDIwLDI1LDMwLDM1LDQwLDQ1LDUwLDU1KSxjZXguYXhpcyA9IDEuMykKbGVnZW5kKCJ0b3ByaWdodCIsbGVnZW5kID0gYygiaHVtYW4iLCJsaWdodG5pbmciKSwgZmlsbD1jKCJncmV5IiwiYmxhY2siKSxjZXg9MS40LGJ0eSA9ICJuIikKZGV2Lm9mZigpCgojIyMjIyMjIyAgbWVkaXRlcmFuZWFuICBhdXR1bW4jIyMjIyMjIyMjIwpvdXQxID0gc3Vic2V0KHJlczc1LGNhdXNlID09IDEgJiByZXM3NSRlY28xID09IDExICYgKCByZXM3NSRtb250aCA+OCkpICAgIzE9bGlnaHRuaW5nOyAxND11bmtub3duOyA3PWFyc29uCm91dDIgPSBzdWJzZXQocmVzNzUsY2F1c2UgIT0xICYgY2F1c2UgIT0gMTQgJiByZXM3NSRlY28xID09IDExICYgKCByZXM3NSRtb250aCA+OCApKQojcGVha19kYXkxID0gYXMuZGF0YS5mcmFtZShhZ2dyZWdhdGUob3V0MSRmaXJlX2RheSwgYnkgPSBsaXN0KG91dDEkZmlyZW5hbWUpLCBtaW4pKQpwZWFrX2RheTIgPSBhcy5kYXRhLmZyYW1lKGFnZ3JlZ2F0ZShvdXQyJGZpcmVfZGF5LCBieSA9IGxpc3Qob3V0MiRmaXJlbmFtZSksIG1pbikpCgojcGVha19kYXkxPXN1YnNldChwZWFrX2RheTEseCA8IDU2KQpwZWFrX2RheTI9c3Vic2V0KHBlYWtfZGF5Mix4IDwgNTYpCiNoaXN0LmEgPWhpc3QocGVha19kYXkxJHgsYnJlYWtzID1jKDA6NTUpLHBsb3Q9RikKaGlzdC5iID1oaXN0KHBlYWtfZGF5MiR4LGJyZWFrcyA9YygwOjU1KSxwbG90PUYpCmZnID0gcmJpbmQoMCxoaXN0LmIkY291bnRzKQoKcGRmKGZpbGU9Ii9Vc2Vycy9zdGlqbmhhbnRzb24vRG9jdW1lbnRzL0RvY3VtZW50cy9hcnRpY3Vsb3MvZW5fcHJvY2Vzby9WSUlSU19yb3Mvc3VwX2ZpZzVfdGltZTc1L21lZF9hdXR1bW4ucGRmIix3aWR0aD03LGhlaWdodD01KQpmciA9IGJhcnBsb3QoZmcseGxhYj0iRGF5cyBhZnRlciBpZ25pdGlvbiIseWxhYj0iTnVtYmVyIG9mIGZpcmVzIixjZXgubGFiPTEuNCxjZXguYXhpcyA9IDEuMywgeGxpbT1jKDEsNjUpLCB5bGltPWMoMCw1KSkKYXhpcygxLGMoMC43LDUuNSwxMS41LDE3LjUsMjMuNSwyOS41LDM1LjUsNDEuNSw0Ny41LDUzLjUsNTkuNSw2NS41KSxsYWJlbHM9YygxLDUsMTAsMTUsMjAsMjUsMzAsMzUsNDAsNDUsNTAsNTUpLGNleC5heGlzID0gMS4zKQpsZWdlbmQoInRvcHJpZ2h0IixsZWdlbmQgPSBjKCJodW1hbiIsImxpZ2h0bmluZyIpLCBmaWxsPWMoImdyZXkiLCJibGFjayIpLGNleD0xLjQsYnR5ID0gIm4iKQpkZXYub2ZmKCkKCiMjIyMjIyMjICBub3J0aCBjYWwgIGF1dHVtbiAjIyMjIyMjIyMjIwpvdXQxID0gc3Vic2V0KHJlczc1LGNhdXNlID09IDEgICYgKHJlczc1JGVjbzEgPT0gNiB8IHJlczc1JGVjbzEgPT0gNykmICggcmVzNzUkbW9udGggPjgpKSAgICMxPWxpZ2h0bmluZzsgMTQ9dW5rbm93bjsgNz1hcnNvbgpvdXQyID0gc3Vic2V0KHJlczc1LGNhdXNlICE9MSAmIGNhdXNlICE9IDE0ICAmIChyZXM3NSRlY28xID09IDYgfCByZXM3NSRlY28xID09IDcpJiAoIHJlczc1JG1vbnRoID44ICkpCnBlYWtfZGF5MSA9IGFzLmRhdGEuZnJhbWUoYWdncmVnYXRlKG91dDEkZmlyZV9kYXksIGJ5ID0gbGlzdChvdXQxJGZpcmVuYW1lKSwgbWluKSkKcGVha19kYXkyID0gYXMuZGF0YS5mcmFtZShhZ2dyZWdhdGUob3V0MiRmaXJlX2RheSwgYnkgPSBsaXN0KG91dDIkZmlyZW5hbWUpLCBtaW4pKQoKcGVha19kYXkxPXN1YnNldChwZWFrX2RheTEseCA8IDU2KQpwZWFrX2RheTI9c3Vic2V0KHBlYWtfZGF5Mix4IDwgNTYpCmhpc3QuYSA9aGlzdChwZWFrX2RheTEkeCxicmVha3MgPWMoMDo1NSkscGxvdD1GKQpoaXN0LmIgPWhpc3QocGVha19kYXkyJHgsYnJlYWtzID1jKDA6NTUpLHBsb3Q9RikKZmcgPSByYmluZChoaXN0LmEkY291bnRzLGhpc3QuYiRjb3VudHMpCgpwZGYoZmlsZT0iL1VzZXJzL3N0aWpuaGFudHNvbi9Eb2N1bWVudHMvRG9jdW1lbnRzL2FydGljdWxvcy9lbl9wcm9jZXNvL1ZJSVJTX3Jvcy9zdXBfZmlnNV90aW1lNzUvbm9ydGhfYXV0dW1uLnBkZiIsd2lkdGg9NyxoZWlnaHQ9NSkKZnIgPSBiYXJwbG90KGZnLHhsYWI9IkRheXMgYWZ0ZXIgaWduaXRpb24iLHlsYWI9Ik51bWJlciBvZiBmaXJlcyIsY2V4LmxhYj0xLjQsY2V4LmF4aXMgPSAxLjMsIHhsaW09YygxLDY1KSwgeWxpbT1jKDAsNSkpCmF4aXMoMSxjKDAuNyw1LjUsMTEuNSwxNy41LDIzLjUsMjkuNSwzNS41LDQxLjUsNDcuNSw1My41LDU5LjUsNjUuNSksbGFiZWxzPWMoMSw1LDEwLDE1LDIwLDI1LDMwLDM1LDQwLDQ1LDUwLDU1KSxjZXguYXhpcyA9IDEuMykKbGVnZW5kKCJ0b3ByaWdodCIsbGVnZW5kID0gYygiaHVtYW4iLCJsaWdodG5pbmciKSwgZmlsbD1jKCJncmV5IiwiYmxhY2siKSxjZXg9MS40LGJ0eSA9ICJuIikKZGV2Lm9mZigpCmBgYAoKCmBgYHtyfQoKcmVzPXJlc1tyZXMkcm9zX2ttPjAsXQpyZXNfZiA9IHJlc1tyZXMkbWF4X2xhbmQgPT0gMSxdCnJlc19wID0gcmVzW3JlcyRtYXhfbGFuZCAhPSAxLF0KCiNqdXN0IHNob3cgdGhlIHBsb3QgaGVyZQpwbG90KHJlc19mJG1lYW5fZnJwfnJlc19mJHJvc19rbSxsb2c9Inh5Iix4bGltPWMoMC4wMDUsMzApLHlsaW09YygwLjEsMTgwKSx4YXh0PSJuIix5bGFiPSJtZWFuIEZSUCAoTVcpIix4bGFiPSJSYXRlLW9mLVNwcmVhZCAoa20vZGF5KSIsIGNleC5sYWI9MS40LGNleC5heGlzID0gMS4zLGNvbD0iZGFya2dyZWVuIikKCm1hcmtzPWMoMC4wMSwwLjEsMSwxMCkKbWFya3MxPWMoMC4xLDAuNSw1LDUwKQp0aWZmKCIvVXNlcnMvc3Rpam5oYW50c29uL0RvY3VtZW50cy9Eb2N1bWVudHMvYXJ0aWN1bG9zL2VuX3Byb2Nlc28vVklJUlNfcm9zL2ZpZ19GUlBfcm9zX3YzLnRpZiIsIHdpZHRoID0gNSwgaGVpZ2h0ID0gNSwgdW5pdHMgPSAnaW4nLCByZXMgPSAzMDApCnBsb3QocmVzX2YkbWVhbl9mcnB+cmVzX2Ykcm9zX2ttLGxvZz0ieHkiLHhsaW09YygwLjAwNSwzMCkseWxpbT1jKDAuMSwxODApLHhheHQ9Im4iLHlheHQ9Im4iLHlsYWI9Im1lYW4gRlJQIChNVykiLHhsYWI9IlJhdGUtb2YtU3ByZWFkIChrbS9kYXkpIiwgY2V4LmxhYj0xLjQsY2V4LmF4aXMgPSAxLjMsY29sPSJkYXJrZ3JlZW4iKQpwb2ludHMocmVzX3AkbWVhbl9mcnB+cmVzX3Akcm9zX2ttLGNvbD0ib3JhbmdlIikKYXhpcygxLGF0PW1hcmtzLGxhYmVscz1tYXJrcyxjZXguYXhpcz0xLjQgKQpheGlzKDIsYXQ9bWFya3MxLGxhYmVscz1tYXJrczEsY2V4LmF4aXM9MS40ICkKbGVnZW5kKCB4PSJ0b3BsZWZ0IixsZWdlbmQ9YygiRm9yZXN0IiwiR3Jhc3MgJiBzaHJ1YiIpLGNvbD1jKCJkYXJrZ3JlZW4iLCJvcmFuZ2UiKSxjZXg9MS4yLHBjaD0xLGJ0eSA9ICJuIikKZGV2Lm9mZigpCgoKCmBgYAoKCiMjIyMjIyMjICBkaWZmZXJlbmNlIGluIGZpcmUgc2l6ZSBmb3IgZmlyc3QgNSBkYXlzIGFjcm9zcyBjYWxpZm9ybmlhIGFuZCBib3RoIGVjb3N5c3RlbXMgCgpgYGB7cn0KIApyZXMkcm9zMSA9IHJlcyRtYXhfcm9zKzEKCgpvdXQxID0gc3Vic2V0KHJlcyxjYXVzZSA9PSAxICkgICAjMT1saWdodG5pbmc7IDE0PXVua25vd247IDc9YXJzb24Kb3V0MiA9IHN1YnNldChyZXMsY2F1c2UgIT0xICYgY2F1c2UgIT0gMTQgKQoKaHVtMSA9IG91dDJbb3V0MiRmaXJlX2RheSA9PTEsXQpodW0yID0gb3V0MltvdXQyJGZpcmVfZGF5ID09MixdCmh1bTMgPSBvdXQyW291dDIkZmlyZV9kYXkgPT0zLF0KaHVtNCA9IG91dDJbb3V0MiRmaXJlX2RheSA9PTQsXQpodW01ID0gb3V0MltvdXQyJGZpcmVfZGF5ID09NSxdCmxpZzEgPSBvdXQxW291dDEkZmlyZV9kYXkgPT0xLF0KbGlnMiA9IG91dDFbb3V0MSRmaXJlX2RheSA9PTIsXQpsaWczID0gb3V0MVtvdXQxJGZpcmVfZGF5ID09MyxdCmxpZzQgPSBvdXQxW291dDEkZmlyZV9kYXkgPT00LF0KbGlnNSA9IG91dDFbb3V0MSRmaXJlX2RheSA9PTUsXQptZWFuKGh1bTEkZ3Jvd3RoKQptZWFuKGh1bTIkZ3Jvd3RoKQptZWFuKGh1bTMkZ3Jvd3RoKQptZWFuKGh1bTQkZ3Jvd3RoKQptZWFuKGh1bTUkZ3Jvd3RoKQptZWFuKGxpZzEkZ3Jvd3RoKQptZWFuKGxpZzIkZ3Jvd3RoKQptZWFuKGxpZzMkZ3Jvd3RoKQptZWFuKGxpZzQkZ3Jvd3RoKQptZWFuKGxpZzUkZ3Jvd3RoKQp0LnRlc3QobG9nMTAoaHVtMSRncm93dGgpLGxvZzEwKGxpZzEkZ3Jvd3RoKSkKdC50ZXN0KGxvZzEwKGh1bTIkZ3Jvd3RoKSxsb2cxMChsaWcyJGdyb3d0aCkpCnQudGVzdChsb2cxMChodW0zJGdyb3d0aCksbG9nMTAobGlnMyRncm93dGgpKQp0LnRlc3QobG9nMTAoaHVtNCRncm93dGgpLGxvZzEwKGxpZzQkZ3Jvd3RoKSkKdC50ZXN0KGxvZzEwKGh1bTUkZ3Jvd3RoKSxsb2cxMChsaWc1JGdyb3d0aCkpCgpodW0xID0gb3V0MltvdXQyJGZpcmVfZGF5ID09MSAmIG91dDIkZWNvMT09NixdCmh1bTIgPSBvdXQyW291dDIkZmlyZV9kYXkgPT0yICYgb3V0MiRlY28xPT02LF0KaHVtMyA9IG91dDJbb3V0MiRmaXJlX2RheSA9PTMgJiBvdXQyJGVjbzE9PTYsXQpodW00ID0gb3V0MltvdXQyJGZpcmVfZGF5ID09NCAmIG91dDIkZWNvMT09NixdCmh1bTUgPSBvdXQyW291dDIkZmlyZV9kYXkgPT01ICYgb3V0MiRlY28xPT02LF0KbGlnMSA9IG91dDFbb3V0MSRmaXJlX2RheSA9PTEgJiBvdXQxJGVjbzE9PTYsXQpsaWcyID0gb3V0MVtvdXQxJGZpcmVfZGF5ID09MiAmIG91dDEkZWNvMT09NixdCmxpZzMgPSBvdXQxW291dDEkZmlyZV9kYXkgPT0zICYgb3V0MSRlY28xPT02LF0KbGlnNCA9IG91dDFbb3V0MSRmaXJlX2RheSA9PTQgJiBvdXQxJGVjbzE9PTYsXQpsaWc1ID0gb3V0MVtvdXQxJGZpcmVfZGF5ID09NSAmIG91dDEkZWNvMT09NixdCm1lYW4oaHVtMSRncm93dGgpCm1lYW4oaHVtMiRncm93dGgpCm1lYW4oaHVtMyRncm93dGgpCm1lYW4oaHVtNCRncm93dGgpCm1lYW4oaHVtNSRncm93dGgpCm1lYW4obGlnMSRncm93dGgsIG5hLnJtPVQpCm1lYW4obGlnMiRncm93dGgsIG5hLnJtPVQpCm1lYW4obGlnMyRncm93dGgsIG5hLnJtPVQpCm1lYW4obGlnNCRncm93dGgsIG5hLnJtPVQpCm1lYW4obGlnNSRncm93dGgsIG5hLnJtPVQpCnQudGVzdChsb2cxMChodW0xJGdyb3d0aCksbG9nMTAobGlnMSRncm93dGgpKQp0LnRlc3QobG9nMTAoaHVtMiRncm93dGgpLGxvZzEwKGxpZzIkZ3Jvd3RoKSkKdC50ZXN0KGxvZzEwKGh1bTMkZ3Jvd3RoKSxsb2cxMChsaWczJGdyb3d0aCkpCnQudGVzdChsb2cxMChodW00JGdyb3d0aCksbG9nMTAobGlnNCRncm93dGgpKQp0LnRlc3QobG9nMTAoaHVtNSRncm93dGgpLGxvZzEwKGxpZzUkZ3Jvd3RoKSkKCmh1bTEgPSBvdXQyW291dDIkZmlyZV9kYXkgPT0xICYgb3V0MiRlY28xPT0xMSxdCmh1bTIgPSBvdXQyW291dDIkZmlyZV9kYXkgPT0yICYgb3V0MiRlY28xPT0xMSxdCmh1bTMgPSBvdXQyW291dDIkZmlyZV9kYXkgPT0zICYgb3V0MiRlY28xPT0xMSxdCmh1bTQgPSBvdXQyW291dDIkZmlyZV9kYXkgPT00ICYgb3V0MiRlY28xPT0xMSxdCmh1bTUgPSBvdXQyW291dDIkZmlyZV9kYXkgPT01ICYgb3V0MiRlY28xPT0xMSxdCmxpZzEgPSBvdXQxW291dDEkZmlyZV9kYXkgPT0xICYgb3V0MSRlY28xPT0xMSxdCmxpZzIgPSBvdXQxW291dDEkZmlyZV9kYXkgPT0yICYgb3V0MSRlY28xPT0xMSxdCmxpZzMgPSBvdXQxW291dDEkZmlyZV9kYXkgPT0zICYgb3V0MSRlY28xPT0xMSxdCmxpZzQgPSBvdXQxW291dDEkZmlyZV9kYXkgPT00ICYgb3V0MSRlY28xPT0xMSxdCmxpZzUgPSBvdXQxW291dDEkZmlyZV9kYXkgPT01ICYgb3V0MSRlY28xPT0xMSxdCm1lYW4oaHVtMSRncm93dGgpCm1lYW4oaHVtMiRncm93dGgpCm1lYW4oaHVtMyRncm93dGgpCm1lYW4oaHVtNCRncm93dGgpCm1lYW4oaHVtNSRncm93dGgpCm1lYW4obGlnMSRncm93dGgsIG5hLnJtPVQpCm1lYW4obGlnMiRncm93dGgsIG5hLnJtPVQpCm1lYW4obGlnMyRncm93dGgsIG5hLnJtPVQpCm1lYW4obGlnNCRncm93dGgsIG5hLnJtPVQpCm1lYW4obGlnNSRncm93dGgsIG5hLnJtPVQpCiN0LnRlc3QobG9nMTAoaHVtMSRncm93dGgpLGxvZzEwKGxpZzEkZ3Jvd3RoKSkKI3QudGVzdChsb2cxMChodW0yJGdyb3d0aCksbG9nMTAobGlnMiRncm93dGgpKQp0LnRlc3QobG9nMTAoaHVtMyRncm93dGgpLGxvZzEwKGxpZzMkZ3Jvd3RoKSkKdC50ZXN0KGxvZzEwKGh1bTQkZ3Jvd3RoKSxsb2cxMChsaWc0JGdyb3d0aCkpCnQudGVzdChsb2cxMChodW01JGdyb3d0aCksbG9nMTAobGlnNSRncm93dGgpKQoKCmBgYAoKYGBge3J9CgpvdXQxID0gc3Vic2V0KHJlcyxjYXVzZSA9PSAxICkgICAjMT1saWdodG5pbmc7IDE0PXVua25vd247IDc9YXJzb24Kb3V0MiA9IHN1YnNldChyZXMsY2F1c2UgIT0xICYgY2F1c2UgIT0gMTQgKQoKbWVhbihvdXQxJHJvc19rbSxuYS5ybT1UKQptZWFuKG91dDIkcm9zX2ttLG5hLnJtPVQpCgpoaXN0LmEgPWhpc3Qob3V0MSRyb3Nfa20sYnJlYWtzID1jKDAsMC4wMSwwLjA1LDAuMSwwLjI1LDAuNSwxLDIsNSwxMCwyMCwzMCkscGxvdD1GKQpoaXN0LmIgPWhpc3Qob3V0MiRyb3Nfa20sYnJlYWtzID1jKDAsMC4wMSwwLjA1LDAuMSwwLjI1LDAuNSwxLDIsNSwxMCwyMCwzMCkscGxvdD1GKQpmZyA9IHJiaW5kKGhpc3QuYSRjb3VudHMsaGlzdC5iJGNvdW50cykKCmZyID0gYmFycGxvdChmZywgYmVzaWRlPVRSVUUseGxhYj0iUmF0ZS1vZi1TcHJlYWQgKGttL2RheSkiLHlsYWI9Ik51bWJlciBvZiBmaXJlIGRheXMiLGNleC5sYWI9MS40LGNleC5heGlzID0gMS4zKQpheGlzKDEsYXQ9YygwLjUsMy41LDYuNSw5LjUsMTIuNSwxNS41LDE4LjUsMjEuNSwyNC41LDI3LjUsMzAuNSwzMy41KSxsYWJlbHM9aGlzdC5hJGJyZWFrcyxjZXguYXhpcyA9IDEuMykKbGVnZW5kKCJ0b3ByaWdodCIsbGVnZW5kID0gYygiaHVtYW4iLCJsaWdodG5pbmciKSwgZmlsbD1jKCJncmV5IiwiYmxhY2siKSxjZXg9MS40LGJ0eSA9ICJuIikKCm91dDEgPSBzdWJzZXQocmVzLGNhdXNlID09IDEgJiAoZWNvMSA9PSA2IHwgZWNvMSA9PSA3KSkgICAjMT1saWdodG5pbmc7IDE0PXVua25vd247IDc9YXJzb24Kb3V0MiA9IHN1YnNldChyZXMsY2F1c2UgIT0xICYgY2F1c2UgIT0gMTQgJiAoZWNvMSA9PSA2IHwgZWNvMSA9PSA3KSkKCmhpc3QuYSA9aGlzdChvdXQxJHJvc19rbSxicmVha3MgPWMoMCwwLjAxLDAuMDUsMC4xLDAuMjUsMC41LDEsMiw1LDEwLDIwLDMwKSxwbG90PUYpCmhpc3QuYiA9aGlzdChvdXQyJHJvc19rbSxicmVha3MgPWMoMCwwLjAxLDAuMDUsMC4xLDAuMjUsMC41LDEsMiw1LDEwLDIwLDMwKSxwbG90PUYpCmZnID0gcmJpbmQoaGlzdC5hJGNvdW50cyxoaXN0LmIkY291bnRzKQoKZnIgPSBiYXJwbG90KGZnLCBiZXNpZGU9VFJVRSx4bGFiPSJSYXRlLW9mLVNwcmVhZCAoa20vZGF5KSIseWxhYj0iTnVtYmVyIG9mIGZpcmUgZGF5cyIsY2V4LmxhYj0xLjQsY2V4LmF4aXMgPSAxLjMpCmF4aXMoMSxhdD1jKDAuNSwzLjUsNi41LDkuNSwxMi41LDE1LjUsMTguNSwyMS41LDI0LjUsMjcuNSwzMC41LDMzLjUpLGxhYmVscz1oaXN0LmEkYnJlYWtzLGNleC5heGlzID0gMS4zKQpsZWdlbmQoInRvcHJpZ2h0IixsZWdlbmQgPSBjKCJodW1hbiIsImxpZ2h0bmluZyIpLCBmaWxsPWMoImdyZXkiLCJibGFjayIpLGNleD0xLjQsYnR5ID0gIm4iKQoKb3V0MSA9IHN1YnNldChyZXMsY2F1c2UgPT0gMSAmIGVjbzEgPT0gMTEpICAgIzE9bGlnaHRuaW5nOyAxND11bmtub3duOyA3PWFyc29uCm91dDIgPSBzdWJzZXQocmVzLGNhdXNlICE9MSAmIGNhdXNlICE9IDE0ICYgZWNvMSA9PSAxMSkKCmhpc3QuYSA9aGlzdChvdXQxJHJvc19rbSxicmVha3MgPWMoMCwwLjAxLDAuMDUsMC4xLDAuMjUsMC41LDEsMiw1LDEwLDIwLDMwKSxwbG90PUYpCmhpc3QuYiA9aGlzdChvdXQyJHJvc19rbSxicmVha3MgPWMoMCwwLjAxLDAuMDUsMC4xLDAuMjUsMC41LDEsMiw1LDEwLDIwLDMwKSxwbG90PUYpCmZnID0gcmJpbmQoaGlzdC5hJGNvdW50cyxoaXN0LmIkY291bnRzKQoKZnIgPSBiYXJwbG90KGZnLCBiZXNpZGU9VFJVRSx4bGFiPSJSYXRlLW9mLVNwcmVhZCAoa20vZGF5KSIseWxhYj0iTnVtYmVyIG9mIGZpcmUgZGF5cyIsY2V4LmxhYj0xLjQsY2V4LmF4aXMgPSAxLjMpCmF4aXMoMSxhdD1jKDAuNSwzLjUsNi41LDkuNSwxMi41LDE1LjUsMTguNSwyMS41LDI0LjUsMjcuNSwzMC41LDMzLjUpLGxhYmVscz1oaXN0LmEkYnJlYWtzLGNleC5heGlzID0gMS4zKQpsZWdlbmQoInRvcHJpZ2h0IixsZWdlbmQgPSBjKCJodW1hbiIsImxpZ2h0bmluZyIpLCBmaWxsPWMoImdyZXkiLCJibGFjayIpLGNleD0xLjQsYnR5ID0gIm4iKQoKIyMjIyMjIyMjIyMjIGF1dHVtbiBub3J0aGVybiBjYWxpZm9ybmlhCm91dDEgPSBzdWJzZXQocmVzLGNhdXNlID09IDEgJiAoZWNvMSA9PSA2IHwgZWNvMSA9PSA3KSAmIChtb250aCA+IDkpKSAgICMxPWxpZ2h0bmluZzsgMTQ9dW5rbm93bjsgNz1hcnNvbgpvdXQyID0gc3Vic2V0KHJlcyxjYXVzZSAhPTEgJiBjYXVzZSAhPSAxNCAmIChlY28xID09IDYgfCBlY28xID09IDcpICYgKG1vbnRoID4gOSkpCgpoaXN0LmEgPWhpc3Qob3V0MSRyb3Nfa20sYnJlYWtzID1jKDAsMC4wMSwwLjA1LDAuMSwwLjI1LDAuNSwxLDIsNSwxMCwyMCwzMCkscGxvdD1GKQpoaXN0LmIgPWhpc3Qob3V0MiRyb3Nfa20sYnJlYWtzID1jKDAsMC4wMSwwLjA1LDAuMSwwLjI1LDAuNSwxLDIsNSwxMCwyMCwzMCkscGxvdD1GKQpmZyA9IHJiaW5kKGhpc3QuYSRjb3VudHMsaGlzdC5iJGNvdW50cykKCmZyID0gYmFycGxvdChmZywgYmVzaWRlPVRSVUUseGxhYj0iUmF0ZS1vZi1TcHJlYWQgKGttL2RheSkiLHlsYWI9Ik51bWJlciBvZiBmaXJlIGRheXMiLGNleC5sYWI9MS40LGNleC5heGlzID0gMS4zKQpheGlzKDEsYXQ9YygwLjUsMy41LDYuNSw5LjUsMTIuNSwxNS41LDE4LjUsMjEuNSwyNC41LDI3LjUsMzAuNSwzMy41KSxsYWJlbHM9aGlzdC5hJGJyZWFrcyxjZXguYXhpcyA9IDEuMykKbGVnZW5kKCJ0b3ByaWdodCIsbGVnZW5kID0gYygiaHVtYW4iLCJsaWdodG5pbmciKSwgZmlsbD1jKCJncmV5IiwiYmxhY2siKSxjZXg9MS40LGJ0eSA9ICJuIikKCiMjIyMjIyMjIyMjIyBhdXR1bW4gbWVkaXRlcmVhbiBjYWxpZm9ybmlhCm91dDEgPSBzdWJzZXQocmVzLGNhdXNlID09IDEgJiBlY28xID09IDExICYgKG1vbnRoID4gOSkpICAgIzE9bGlnaHRuaW5nOyAxND11bmtub3duOyA3PWFyc29uCm91dDIgPSBzdWJzZXQocmVzLGNhdXNlICE9MSAmIGNhdXNlICE9IDE0ICYgZWNvMSA9PSAxMSAmIChtb250aCA+IDkpKQoKaGlzdC5hID1oaXN0KG91dDEkcm9zX2ttLGJyZWFrcyA9YygwLDAuMDEsMC4wNSwwLjEsMC4yNSwwLjUsMSwyLDUsMTAsMjAsMzApLHBsb3Q9RikKaGlzdC5iID1oaXN0KG91dDIkcm9zX2ttLGJyZWFrcyA9YygwLDAuMDEsMC4wNSwwLjEsMC4yNSwwLjUsMSwyLDUsMTAsMjAsMzApLHBsb3Q9RikKZmcgPSByYmluZChoaXN0LmEkY291bnRzLGhpc3QuYiRjb3VudHMpCgpmciA9IGJhcnBsb3QoZmcsIGJlc2lkZT1UUlVFLHhsYWI9IlJhdGUtb2YtU3ByZWFkIChrbS9kYXkpIix5bGFiPSJOdW1iZXIgb2YgZmlyZSBkYXlzIixjZXgubGFiPTEuNCxjZXguYXhpcyA9IDEuMykKYXhpcygxLGF0PWMoMC41LDMuNSw2LjUsOS41LDEyLjUsMTUuNSwxOC41LDIxLjUsMjQuNSwyNy41LDMwLjUsMzMuNSksbGFiZWxzPWhpc3QuYSRicmVha3MsY2V4LmF4aXMgPSAxLjMpCmxlZ2VuZCgidG9wcmlnaHQiLGxlZ2VuZCA9IGMoImh1bWFuIiwibGlnaHRuaW5nIiksIGZpbGw9YygiZ3JleSIsImJsYWNrIiksY2V4PTEuNCxidHkgPSAibiIpCgojIyMjIyMjIyMjIyMgc3VtbWVyIG5vcnRoZXJuIGNhbGlmb3JuaWEKb3V0MSA9IHN1YnNldChyZXMsY2F1c2UgPT0gMSAmIChlY28xID09IDYgfCBlY28xID09IDcpICYgKG1vbnRoID4gNSAmIG1vbnRoPDEwKSkgICAjMT1saWdodG5pbmc7IDE0PXVua25vd247IDc9YXJzb24Kb3V0MiA9IHN1YnNldChyZXMsY2F1c2UgIT0xICYgY2F1c2UgIT0gMTQgJiAoZWNvMSA9PSA2IHwgZWNvMSA9PSA3KSAmIChtb250aCA+IDUgJiBtb250aDwxMCkpCgpoaXN0LmEgPWhpc3Qob3V0MSRyb3Nfa20sYnJlYWtzID1jKDAsMC4wMSwwLjA1LDAuMSwwLjI1LDAuNSwxLDIsNSwxMCwyMCwzMCkscGxvdD1GKQpoaXN0LmIgPWhpc3Qob3V0MiRyb3Nfa20sYnJlYWtzID1jKDAsMC4wMSwwLjA1LDAuMSwwLjI1LDAuNSwxLDIsNSwxMCwyMCwzMCkscGxvdD1GKQpmZyA9IHJiaW5kKGhpc3QuYSRjb3VudHMsaGlzdC5iJGNvdW50cykKCmZyID0gYmFycGxvdChmZywgYmVzaWRlPVRSVUUseGxhYj0iUmF0ZS1vZi1TcHJlYWQgKGttL2RheSkiLHlsYWI9Ik51bWJlciBvZiBmaXJlIGRheXMiLGNleC5sYWI9MS40LGNleC5heGlzID0gMS4zKQpheGlzKDEsYXQ9YygwLjUsMy41LDYuNSw5LjUsMTIuNSwxNS41LDE4LjUsMjEuNSwyNC41LDI3LjUsMzAuNSwzMy41KSxsYWJlbHM9aGlzdC5hJGJyZWFrcyxjZXguYXhpcyA9IDEuMykKbGVnZW5kKCJ0b3ByaWdodCIsbGVnZW5kID0gYygiaHVtYW4iLCJsaWdodG5pbmciKSwgZmlsbD1jKCJncmV5IiwiYmxhY2siKSxjZXg9MS40LGJ0eSA9ICJuIikKCiMjIyMjIyMjIyMjIyBzdW1tZXIgbWVkaXRlcmVhbiBjYWxpZm9ybmlhCm91dDEgPSBzdWJzZXQocmVzLGNhdXNlID09IDEgJiBlY28xID09IDExICAmIChtb250aCA+IDUgJiBtb250aDwxMCkpICAgIzE9bGlnaHRuaW5nOyAxND11bmtub3duOyA3PWFyc29uCm91dDIgPSBzdWJzZXQocmVzLGNhdXNlICE9MSAmIGNhdXNlICE9IDE0ICYgZWNvMSA9PSAxMSAgJiAobW9udGggPiA1ICYgbW9udGg8MTApKQoKaGlzdC5hID1oaXN0KG91dDEkcm9zX2ttLGJyZWFrcyA9YygwLDAuMDEsMC4wNSwwLjEsMC4yNSwwLjUsMSwyLDUsMTAsMjAsMzApLHBsb3Q9RikKaGlzdC5iID1oaXN0KG91dDIkcm9zX2ttLGJyZWFrcyA9YygwLDAuMDEsMC4wNSwwLjEsMC4yNSwwLjUsMSwyLDUsMTAsMjAsMzApLHBsb3Q9RikKZmcgPSByYmluZChoaXN0LmEkY291bnRzLGhpc3QuYiRjb3VudHMpCgpmciA9IGJhcnBsb3QoZmcsIGJlc2lkZT1UUlVFLHhsYWI9IlJhdGUtb2YtU3ByZWFkIChrbS9kYXkpIix5bGFiPSJOdW1iZXIgb2YgZmlyZSBkYXlzIixjZXgubGFiPTEuNCxjZXguYXhpcyA9IDEuMykKYXhpcygxLGF0PWMoMC41LDMuNSw2LjUsOS41LDEyLjUsMTUuNSwxOC41LDIxLjUsMjQuNSwyNy41LDMwLjUsMzMuNSksbGFiZWxzPWhpc3QuYSRicmVha3MsY2V4LmF4aXMgPSAxLjMpCmxlZ2VuZCgidG9wcmlnaHQiLGxlZ2VuZCA9IGMoImh1bWFuIiwibGlnaHRuaW5nIiksIGZpbGw9YygiZ3JleSIsImJsYWNrIiksY2V4PTEuNCxidHkgPSAibiIpCgpgYGAKCmBgYHtyfQoKb3V0MSA9IHN1YnNldChyZXMsY2F1c2UgPT0gMSApICAgIzE9bGlnaHRuaW5nOyAxND11bmtub3duOyA3PWFyc29uCm91dDIgPSBzdWJzZXQocmVzLGNhdXNlICE9MSAmIGNhdXNlICE9IDE0ICkKCm1lYW4ob3V0MSRyb3Nfa20sbmEucm09VCkKbWVhbihvdXQyJHJvc19rbSxuYS5ybT1UKQojMCwwLjI1LDAuNSwxLDIsMyw1LDcsMTAsMjAsMzAKaGlzdC5hID1oaXN0KG91dDEkcm9zX2ttLGJyZWFrcyA9YygwLDAuNSwxLDIsMyw1LDcsMTAsMjAsMzApLHBsb3Q9RikKaGlzdC5iID1oaXN0KG91dDIkcm9zX2ttLGJyZWFrcyA9YygwLDAuNSwxLDIsMyw1LDcsMTAsMjAsMzApLHBsb3Q9RikKZmcgPSByYmluZChoaXN0LmEkY291bnRzLGhpc3QuYiRjb3VudHMpCmRlbnMgPSByYmluZCgoaGlzdC5hJGNvdW50cy8oc3VtKGhpc3QuYSRjb3VudHMpKSkqMTAwLChoaXN0LmIkY291bnRzLyhzdW0oaGlzdC5iJGNvdW50cykpKSoxMDApCgpmciA9IGJhcnBsb3QoZmcsIGJlc2lkZT1UUlVFLHhsYWI9IlJhdGUtb2YtU3ByZWFkIChrbS9kYXkpIix5bGFiPSJOdW1iZXIgb2YgZmlyZSBkYXlzIixjZXgubGFiPTEuNCxjZXguYXhpcyA9IDEuMykKYXhpcygxLGF0PWMoMC41LDMuNSw2LjUsOS41LDEyLjUsMTUuNSwxOC41LDIxLjUsMjQuNSwyNy41KSxsYWJlbHM9aGlzdC5hJGJyZWFrcyxjZXguYXhpcyA9IDEuMykKbGVnZW5kKCJ0b3ByaWdodCIsbGVnZW5kID0gYygiaHVtYW4iLCJsaWdodG5pbmciKSwgZmlsbD1jKCJncmV5IiwiYmxhY2siKSxjZXg9MS40LGJ0eSA9ICJuIikKCmZyID0gYmFycGxvdChkZW5zLCBiZXNpZGU9VFJVRSx4bGFiPWV4cHJlc3Npb24oJ1JhdGUtb2YtU3ByZWFkIChrbSBkJ14tMSonKScpLHlsYWI9IiUgZmlyZSBkYXlzIix5bGltPWMoMCw2MCksY2V4LmxhYj0xLjQsY2V4LmF4aXMgPSAxLjMpCmF4aXMoMSxhdD1jKDAuNSwzLjUsNi41LDkuNSwxMi41LDE1LjUsMTguNSwyMS41LDI0LjUsMjcuNSksbGFiZWxzPWhpc3QuYSRicmVha3MsY2V4LmF4aXMgPSAxLjMpCmxlZ2VuZCgidG9wcmlnaHQiLGxlZ2VuZCA9IGMoImh1bWFuIiwibGlnaHRuaW5nIiksIGZpbGw9YygiZ3JleSIsImJsYWNrIiksY2V4PTEuNCxidHkgPSAibiIpCgp0aWZmKCIvVXNlcnMvc3Rpam5oYW50c29uL0RvY3VtZW50cy9Eb2N1bWVudHMvYXJ0aWN1bG9zL2VuX3Byb2Nlc28vVklJUlNfcm9zL2ZpZ3VyZTJfZnJlcV92MS50aWYiLCB3aWR0aCA9IDYsIGhlaWdodCA9IDUsIHVuaXRzID0gJ2luJywgcmVzID0gMzAwKQpmciA9IGJhcnBsb3QoZGVucywgYmVzaWRlPVRSVUUseGxhYj1leHByZXNzaW9uKCdSYXRlLW9mLVNwcmVhZCAoa20gZCdeLTEqJyknKSx5bGFiPSIlIGZpcmUgZGF5cyIseWxpbT1jKDAsNjApLGNleC5sYWI9MS40LGNleC5heGlzID0gMS4zKQpheGlzKDEsYXQ9YygwLjUsMy41LDYuNSw5LjUsMTIuNSwxNS41LDE4LjUsMjEuNSwyNC41LDI3LjUpLGxhYmVscz1oaXN0LmEkYnJlYWtzLGNleC5heGlzID0gMS4zKQpsZWdlbmQoInRvcHJpZ2h0IixsZWdlbmQgPSBjKCJodW1hbiIsImxpZ2h0bmluZyIpLCBmaWxsPWMoImdyZXkiLCJibGFjayIpLGNleD0xLjQsYnR5ID0gIm4iKQpkZXYub2ZmKCkgCgoKIyMjIyMjIyMjIyMjIGF1dHVtbiBub3J0aGVybiBjYWxpZm9ybmlhCm91dDEgPSBzdWJzZXQocmVzLGNhdXNlID09IDEgJiAoZWNvMSA9PSA2IHwgZWNvMSA9PSA3KSAmIChtb250aCA+IDkpKSAgICMxPWxpZ2h0bmluZzsgMTQ9dW5rbm93bjsgNz1hcnNvbgpvdXQyID0gc3Vic2V0KHJlcyxjYXVzZSAhPTEgJiBjYXVzZSAhPSAxNCAmIChlY28xID09IDYgfCBlY28xID09IDcpICYgKG1vbnRoID4gOSkpCgpoaXN0LmEgPWhpc3Qob3V0MSRyb3Nfa20sYnJlYWtzID1jKDAsMC41LDEsMiwzLDUsNywxMCwyMCwzMCkscGxvdD1GKQpoaXN0LmIgPWhpc3Qob3V0MiRyb3Nfa20sYnJlYWtzID1jKDAsMC41LDEsMiwzLDUsNywxMCwyMCwzMCkscGxvdD1GKQpmZyA9IHJiaW5kKGhpc3QuYSRjb3VudHMsaGlzdC5iJGNvdW50cykKZGVucyA9IHJiaW5kKChoaXN0LmEkY291bnRzLyhzdW0oaGlzdC5hJGNvdW50cykpKSoxMDAsKGhpc3QuYiRjb3VudHMvKHN1bShoaXN0LmIkY291bnRzKSkpKjEwMCkKCmZyID0gYmFycGxvdChmZywgYmVzaWRlPVRSVUUseGxhYj0iUmF0ZS1vZi1TcHJlYWQgKGttL2RheSkiLHlsYWI9Ik51bWJlciBvZiBmaXJlIGRheXMiLGNleC5sYWI9MS40LGNleC5heGlzID0gMS4zKQpheGlzKDEsYXQ9YygwLjUsMy41LDYuNSw5LjUsMTIuNSwxNS41LDE4LjUsMjEuNSwyNC41LDI3LjUpLGxhYmVscz1oaXN0LmEkYnJlYWtzLGNleC5heGlzID0gMS4zKQpsZWdlbmQoInRvcHJpZ2h0IixsZWdlbmQgPSBjKCJodW1hbiIsImxpZ2h0bmluZyIpLCBmaWxsPWMoImdyZXkiLCJibGFjayIpLGNleD0xLjQsYnR5ID0gIm4iKQoKZnIgPSBiYXJwbG90KGRlbnMsIGJlc2lkZT1UUlVFLHhsYWI9IlJhdGUtb2YtU3ByZWFkIChrbS9kYXkpIix5bGFiPSIlIGZpcmUgZGF5cyIseWxpbT1jKDAsODApLGNleC5sYWI9MS40LGNleC5heGlzID0gMS4zKQpheGlzKDEsYXQ9YygwLjUsMy41LDYuNSw5LjUsMTIuNSwxNS41LDE4LjUsMjEuNSwyNC41LDI3LjUpLGxhYmVscz1oaXN0LmEkYnJlYWtzLGNleC5heGlzID0gMS4zKQpsZWdlbmQoInRvcHJpZ2h0IixsZWdlbmQgPSBjKCJodW1hbiIsImxpZ2h0bmluZyIpLCBmaWxsPWMoImdyZXkiLCJibGFjayIpLGNleD0xLjQsYnR5ID0gIm4iKQoKdGlmZigiL1VzZXJzL3N0aWpuaGFudHNvbi9Eb2N1bWVudHMvRG9jdW1lbnRzL2FydGljdWxvcy9lbl9wcm9jZXNvL1ZJSVJTX3Jvcy9TNF9mcmVxX2F1dHVtbl9ub3J0aF92MS50aWYiLCB3aWR0aCA9IDYsIGhlaWdodCA9IDUsIHVuaXRzID0gJ2luJywgcmVzID0gMzAwKQpmciA9IGJhcnBsb3QoZGVucywgYmVzaWRlPVRSVUUseGxhYj1leHByZXNzaW9uKCdSYXRlLW9mLVNwcmVhZCAoa20gZCdeLTEqJyknKSx5bGFiPSIlIGZpcmUgZGF5cyIseWxpbT1jKDAsODApLGNleC5sYWI9MS40LGNleC5heGlzID0gMS4zKQpheGlzKDEsYXQ9YygwLjUsMy41LDYuNSw5LjUsMTIuNSwxNS41LDE4LjUsMjEuNSwyNC41LDI3LjUpLGxhYmVscz1oaXN0LmEkYnJlYWtzLGNleC5heGlzID0gMS4zKQpsZWdlbmQoInRvcHJpZ2h0IixsZWdlbmQgPSBjKCJodW1hbiIsImxpZ2h0bmluZyIpLCBmaWxsPWMoImdyZXkiLCJibGFjayIpLGNleD0xLjQsYnR5ID0gIm4iKQpkZXYub2ZmKCkgCgojIyMjIyMjIyMjIyMgYXV0dW1uIG1lZGl0ZXJlYW4gY2FsaWZvcm5pYQpvdXQxID0gc3Vic2V0KHJlcyxjYXVzZSA9PSAxICYgZWNvMSA9PSAxMSAmIChtb250aCA+IDkpKSAgICMxPWxpZ2h0bmluZzsgMTQ9dW5rbm93bjsgNz1hcnNvbgpvdXQyID0gc3Vic2V0KHJlcyxjYXVzZSAhPTEgJiBjYXVzZSAhPSAxNCAmIGVjbzEgPT0gMTEgJiAobW9udGggPiA5KSkKCmhpc3QuYSA9aGlzdChvdXQxJHJvc19rbSxicmVha3MgPWMoMCwwLjUsMSwyLDMsNSw3LDEwLDIwLDMwKSxwbG90PUYpCmhpc3QuYiA9aGlzdChvdXQyJHJvc19rbSxicmVha3MgPWMoMCwwLjUsMSwyLDMsNSw3LDEwLDIwLDMwKSxwbG90PUYpCmZnID0gcmJpbmQoaGlzdC5hJGNvdW50cyxoaXN0LmIkY291bnRzKQpkZW5zID0gcmJpbmQoKGhpc3QuYSRjb3VudHMvKHN1bShoaXN0LmEkY291bnRzKSkpKjEwMCwoaGlzdC5iJGNvdW50cy8oc3VtKGhpc3QuYiRjb3VudHMpKSkqMTAwKQoKZnIgPSBiYXJwbG90KGZnLCBiZXNpZGU9VFJVRSx4bGFiPSJSYXRlLW9mLVNwcmVhZCAoa20vZGF5KSIseWxhYj0iTnVtYmVyIG9mIGZpcmUgZGF5cyIsY2V4LmxhYj0xLjQsY2V4LmF4aXMgPSAxLjMpCmF4aXMoMSxhdD1jKDAuNSwzLjUsNi41LDkuNSwxMi41LDE1LjUsMTguNSwyMS41LDI0LjUsMjcuNSksbGFiZWxzPWhpc3QuYSRicmVha3MsY2V4LmF4aXMgPSAxLjMpCmxlZ2VuZCgidG9wcmlnaHQiLGxlZ2VuZCA9IGMoImh1bWFuIiwibGlnaHRuaW5nIiksIGZpbGw9YygiZ3JleSIsImJsYWNrIiksY2V4PTEuNCxidHkgPSAibiIpCgpmciA9IGJhcnBsb3QoZGVucywgYmVzaWRlPVRSVUUseGxhYj0iUmF0ZS1vZi1TcHJlYWQgKGttL2RheSkiLHlsYWI9IiUgZmlyZSBkYXlzIixjZXgubGFiPTEuNCxjZXguYXhpcyA9IDEuMykKYXhpcygxLGF0PWMoMC41LDMuNSw2LjUsOS41LDEyLjUsMTUuNSwxOC41LDIxLjUsMjQuNSwyNy41KSxsYWJlbHM9aGlzdC5hJGJyZWFrcyxjZXguYXhpcyA9IDEuMykKbGVnZW5kKCJ0b3ByaWdodCIsbGVnZW5kID0gYygiaHVtYW4iLCJsaWdodG5pbmciKSwgZmlsbD1jKCJncmV5IiwiYmxhY2siKSxjZXg9MS40LGJ0eSA9ICJuIikKCnRpZmYoIi9Vc2Vycy9zdGlqbmhhbnRzb24vRG9jdW1lbnRzL0RvY3VtZW50cy9hcnRpY3Vsb3MvZW5fcHJvY2Vzby9WSUlSU19yb3MvUzRfZnJlcV9hdXR1bW5fbWVkX3YxLnRpZiIsIHdpZHRoID0gNiwgaGVpZ2h0ID0gNSwgdW5pdHMgPSAnaW4nLCByZXMgPSAzMDApCmZyID0gYmFycGxvdChkZW5zLCBiZXNpZGU9VFJVRSx4bGFiPWV4cHJlc3Npb24oJ1JhdGUtb2YtU3ByZWFkIChrbSBkJ14tMSonKScpLHlsYWI9IiUgZmlyZSBkYXlzIix5bGltPWMoMCwyNSksY2V4LmxhYj0xLjQsY2V4LmF4aXMgPSAxLjMpCmF4aXMoMSxhdD1jKDAuNSwzLjUsNi41LDkuNSwxMi41LDE1LjUsMTguNSwyMS41LDI0LjUsMjcuNSksbGFiZWxzPWhpc3QuYSRicmVha3MsY2V4LmF4aXMgPSAxLjMpCmxlZ2VuZCgidG9wcmlnaHQiLGxlZ2VuZCA9IGMoImh1bWFuIiwibGlnaHRuaW5nIiksIGZpbGw9YygiZ3JleSIsImJsYWNrIiksY2V4PTEuNCxidHkgPSAibiIpCmRldi5vZmYoKSAKCgojIyMjIyMjIyMjIyMgc3VtbWVyIG5vcnRoZXJuIGNhbGlmb3JuaWEKb3V0MSA9IHN1YnNldChyZXMsY2F1c2UgPT0gMSAmIChlY28xID09IDYgfCBlY28xID09IDcpICYgKG1vbnRoID4gNSAmIG1vbnRoPDEwKSkgICAjMT1saWdodG5pbmc7IDE0PXVua25vd247IDc9YXJzb24Kb3V0MiA9IHN1YnNldChyZXMsY2F1c2UgIT0xICYgY2F1c2UgIT0gMTQgJiAoZWNvMSA9PSA2IHwgZWNvMSA9PSA3KSAmIChtb250aCA+IDUgJiBtb250aDwxMCkpCgpoaXN0LmEgPWhpc3Qob3V0MSRyb3Nfa20sYnJlYWtzID1jKDAsMC41LDEsMiwzLDUsNywxMCwyMCwzMCkscGxvdD1GKQpoaXN0LmIgPWhpc3Qob3V0MiRyb3Nfa20sYnJlYWtzID1jKDAsMC41LDEsMiwzLDUsNywxMCwyMCwzMCkscGxvdD1GKQpmZyA9IHJiaW5kKGhpc3QuYSRjb3VudHMsaGlzdC5iJGNvdW50cykKZGVucyA9IHJiaW5kKChoaXN0LmEkY291bnRzLyhzdW0oaGlzdC5hJGNvdW50cykpKSoxMDAsKGhpc3QuYiRjb3VudHMvKHN1bShoaXN0LmIkY291bnRzKSkpKjEwMCkKCmZyID0gYmFycGxvdChmZywgYmVzaWRlPVRSVUUseGxhYj0iUmF0ZS1vZi1TcHJlYWQgKGttL2RheSkiLHlsYWI9Ik51bWJlciBvZiBmaXJlIGRheXMiLGNleC5sYWI9MS40LGNleC5heGlzID0gMS4zKQpheGlzKDEsYXQ9YygwLjUsMy41LDYuNSw5LjUsMTIuNSwxNS41LDE4LjUsMjEuNSwyNC41LDI3LjUpLGxhYmVscz1oaXN0LmEkYnJlYWtzLGNleC5heGlzID0gMS4zKQpsZWdlbmQoInRvcHJpZ2h0IixsZWdlbmQgPSBjKCJodW1hbiIsImxpZ2h0bmluZyIpLCBmaWxsPWMoImdyZXkiLCJibGFjayIpLGNleD0xLjQsYnR5ID0gIm4iKQoKZnIgPSBiYXJwbG90KGRlbnMsIGJlc2lkZT1UUlVFLHhsYWI9IlJhdGUtb2YtU3ByZWFkIChrbS9kYXkpIix5bGFiPSIlIGZpcmUgZGF5cyIsY2V4LmxhYj0xLjQsY2V4LmF4aXMgPSAxLjMpCmF4aXMoMSxhdD1jKDAuNSwzLjUsNi41LDkuNSwxMi41LDE1LjUsMTguNSwyMS41LDI0LjUsMjcuNSksbGFiZWxzPWhpc3QuYSRicmVha3MsY2V4LmF4aXMgPSAxLjMpCmxlZ2VuZCgidG9wcmlnaHQiLGxlZ2VuZCA9IGMoImh1bWFuIiwibGlnaHRuaW5nIiksIGZpbGw9YygiZ3JleSIsImJsYWNrIiksY2V4PTEuNCxidHkgPSAibiIpCgp0aWZmKCIvVXNlcnMvc3Rpam5oYW50c29uL0RvY3VtZW50cy9Eb2N1bWVudHMvYXJ0aWN1bG9zL2VuX3Byb2Nlc28vVklJUlNfcm9zL1M0X2ZyZXFfc3VtbWVyX25vcnRoX3YxLnRpZiIsIHdpZHRoID0gNiwgaGVpZ2h0ID0gNSwgdW5pdHMgPSAnaW4nLCByZXMgPSAzMDApCmZyID0gYmFycGxvdChkZW5zLCBiZXNpZGU9VFJVRSx4bGFiPWV4cHJlc3Npb24oJ1JhdGUtb2YtU3ByZWFkIChrbSBkJ14tMSonKScpLHlsYWI9IiUgZmlyZSBkYXlzIix5bGltPWMoMCw2MCksY2V4LmxhYj0xLjQsY2V4LmF4aXMgPSAxLjMpCmF4aXMoMSxhdD1jKDAuNSwzLjUsNi41LDkuNSwxMi41LDE1LjUsMTguNSwyMS41LDI0LjUsMjcuNSksbGFiZWxzPWhpc3QuYSRicmVha3MsY2V4LmF4aXMgPSAxLjMpCmxlZ2VuZCgidG9wcmlnaHQiLGxlZ2VuZCA9IGMoImh1bWFuIiwibGlnaHRuaW5nIiksIGZpbGw9YygiZ3JleSIsImJsYWNrIiksY2V4PTEuNCxidHkgPSAibiIpCmRldi5vZmYoKSAKCgojIyMjIyMjIyMjIyMgc3VtbWVyIG1lZGl0ZXJlYW4gY2FsaWZvcm5pYQpvdXQxID0gc3Vic2V0KHJlcyxjYXVzZSA9PSAxICYgZWNvMSA9PSAxMSAgJiAobW9udGggPiA1ICYgbW9udGg8MTApKSAgICMxPWxpZ2h0bmluZzsgMTQ9dW5rbm93bjsgNz1hcnNvbgpvdXQyID0gc3Vic2V0KHJlcyxjYXVzZSAhPTEgJiBjYXVzZSAhPSAxNCAmIGVjbzEgPT0gMTEgICYgKG1vbnRoID4gNSAmIG1vbnRoPDEwKSkKCmhpc3QuYSA9aGlzdChvdXQxJHJvc19rbSxicmVha3MgPWMoMCwwLjUsMSwyLDMsNSw3LDEwLDIwLDMwKSxwbG90PUYpCmhpc3QuYiA9aGlzdChvdXQyJHJvc19rbSxicmVha3MgPWMoMCwwLjUsMSwyLDMsNSw3LDEwLDIwLDMwKSxwbG90PUYpCmZnID0gcmJpbmQoaGlzdC5hJGNvdW50cyxoaXN0LmIkY291bnRzKQpkZW5zID0gcmJpbmQoKGhpc3QuYSRjb3VudHMvKHN1bShoaXN0LmEkY291bnRzKSkpKjEwMCwoaGlzdC5iJGNvdW50cy8oc3VtKGhpc3QuYiRjb3VudHMpKSkqMTAwKQoKZnIgPSBiYXJwbG90KGZnLCBiZXNpZGU9VFJVRSx4bGFiPSJSYXRlLW9mLVNwcmVhZCAoa20vZGF5KSIseWxhYj0iTnVtYmVyIG9mIGZpcmUgZGF5cyIsY2V4LmxhYj0xLjQsY2V4LmF4aXMgPSAxLjMpCmF4aXMoMSxhdD1jKDAuNSwzLjUsNi41LDkuNSwxMi41LDE1LjUsMTguNSwyMS41LDI0LjUsMjcuNSksbGFiZWxzPWhpc3QuYSRicmVha3MsY2V4LmF4aXMgPSAxLjMpCmxlZ2VuZCgidG9wcmlnaHQiLGxlZ2VuZCA9IGMoImh1bWFuIiwibGlnaHRuaW5nIiksIGZpbGw9YygiZ3JleSIsImJsYWNrIiksY2V4PTEuNCxidHkgPSAibiIpCgpmciA9IGJhcnBsb3QoZGVucywgYmVzaWRlPVRSVUUseGxhYj0iUmF0ZS1vZi1TcHJlYWQgKGttL2RheSkiLHlsYWI9IiUgZmlyZSBkYXlzIixjZXgubGFiPTEuNCxjZXguYXhpcyA9IDEuMykKYXhpcygxLGF0PWMoMC41LDMuNSw2LjUsOS41LDEyLjUsMTUuNSwxOC41LDIxLjUsMjQuNSwyNy41KSxsYWJlbHM9aGlzdC5hJGJyZWFrcyxjZXguYXhpcyA9IDEuMykKbGVnZW5kKCJ0b3ByaWdodCIsbGVnZW5kID0gYygiaHVtYW4iLCJsaWdodG5pbmciKSwgZmlsbD1jKCJncmV5IiwiYmxhY2siKSxjZXg9MS40LGJ0eSA9ICJuIikKCnRpZmYoIi9Vc2Vycy9zdGlqbmhhbnRzb24vRG9jdW1lbnRzL0RvY3VtZW50cy9hcnRpY3Vsb3MvZW5fcHJvY2Vzby9WSUlSU19yb3MvUzRfZnJlcV9zdW1tZXJfbWVkX3YxLnRpZiIsIHdpZHRoID0gNiwgaGVpZ2h0ID0gNSwgdW5pdHMgPSAnaW4nLCByZXMgPSAzMDApCmZyID0gYmFycGxvdChkZW5zLCBiZXNpZGU9VFJVRSx4bGFiPWV4cHJlc3Npb24oJ1JhdGUtb2YtU3ByZWFkIChrbSBkJ14tMSonKScpLHlsYWI9IiUgZmlyZSBkYXlzIixjZXgubGFiPTEuNCxjZXguYXhpcyA9IDEuMykKYXhpcygxLGF0PWMoMC41LDMuNSw2LjUsOS41LDEyLjUsMTUuNSwxOC41LDIxLjUsMjQuNSwyNy41KSxsYWJlbHM9aGlzdC5hJGJyZWFrcyxjZXguYXhpcyA9IDEuMykKbGVnZW5kKCJ0b3ByaWdodCIsbGVnZW5kID0gYygiaHVtYW4iLCJsaWdodG5pbmciKSwgZmlsbD1jKCJncmV5IiwiYmxhY2siKSxjZXg9MS40LGJ0eSA9ICJuIikKZGV2Lm9mZigpIAoKCmBgYAoKIyMjIyMjIyMjIyMjIyMjIyMgMjAgZmFzdGVzdCBmaXJlcyAgIyMjIyMjIyMjIyMjIwpgYGB7cn0KCnJlczEgPSByZXNbcmVzJHJvc19rbSA+IDEwICYgIWlzLm5hKHJlcyRyb3Nfa20pLF0KbGVuZ3RoKHJlczEkcm9zX2ttKQpyZXMxCmBgYAoKCiMjIyMjIyMjIyMjIyBhcmUgUk9TIHRoZSBzYW1lIGZvciBsaWdodCAmIGh1bWFuIHVuZGVyIHRoZSBzYW1lIGNvbmRpdGlvbnMKCmBgYHtyfQpvdXQxID0gc3Vic2V0KHJlcyxjYXVzZSA9PSAxICkgICAjMT1saWdodG5pbmc7IDE0PXVua25vd247IDc9YXJzb24Kb3V0MiA9IHN1YnNldChyZXMsY2F1c2UgIT0xICYgY2F1c2UgIT0gMTQgKQoKcGxvdChvdXQxJHZwZCxsb2cob3V0MSRyb3Nfa20pKQpwb2ludHMob3V0MiR2cGQsbG9nKG91dDIkcm9zX2ttKSxjb2w9InJlZCIpCgpzdW1tYXJ5KGxtKG91dDEkdnBkfmxvZyhvdXQxJHJvc19rbSsxKSxuYS5vbWl0PVQpKQpzdW1tYXJ5KGxtKG91dDIkdnBkfmxvZyhvdXQyJHJvc19rbSsxKSkpCgpgYGAKCgoKCiMjIyMjIyMjIyMjIyMjIGFuYWx5c2lzIG9mIHRoZSBmaXJzdCBkYXkgIyMjIyMjIyMjIyMjIyMjIyMKCmxvYWQgZGF0YQpgYGB7cn0KCmRhaWx5X3Jlcz1yZWFkLnRhYmxlKCIvVXNlcnMvc3Rpam5oYW50c29uL0RvY3VtZW50cy9wcm9qZWN0cy9WSUlSU19yb3MvYWxsX2lnbml0aW9uc19WMy50eHQiLGhlYWRlcj1UKQoKcmVzPWFzLmRhdGEuZnJhbWUoZGFpbHlfcmVzKQoKcmVzJGJpID1hcy5udW1lcmljKGFzLmNoYXJhY3RlcihyZXMkYmkpKQpyZXMkZXJjID1hcy5udW1lcmljKGFzLmNoYXJhY3RlcihyZXMkZXJjKSkKcmVzJGV0ciA9YXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIocmVzJGV0cikpCnJlcyRmbTEwMCA9YXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIocmVzJGZtMTAwKSkKcmVzJGZtMTAwMCA9YXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIocmVzJGZtMTAwMCkpCnJlcyRwZXQgPWFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKHJlcyRwZXQpKQpyZXMkcHIgPWFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKHJlcyRwcikpCnJlcyRybWF4ID1hcy5udW1lcmljKGFzLmNoYXJhY3RlcihyZXMkcm1heCkpCnJlcyRybWluID1hcy5udW1lcmljKGFzLmNoYXJhY3RlcihyZXMkcm1pbikpCnJlcyR0aCA9YXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIocmVzJHRoKSkKcmVzJHRtbW4gPWFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKHJlcyR0bW1uKSkKcmVzJHRtbXggPWFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKHJlcyR0bW14KSkKcmVzJHZwZCA9YXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIocmVzJHZwZCkpCnJlcyR3cyA9YXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIocmVzJHdzKSkKcmVzJHZzID1hcy5udW1lcmljKGFzLmNoYXJhY3RlcihyZXMkdnMpKQpyZXMkdG90YWxfYXJlYSA9YXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIocmVzJHRvdGFsX2FyZWEpKQpyZXMkbWF4X2xhbmQgPWFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKHJlcyRtYXhfbGFuZCkpCnJlcyRtZWFuX2xhbmQgPWFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKHJlcyRtZWFuX2xhbmQpKQoKcmVzJGJpb21hc3MgPWFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKHJlcyRiaW9tYXNzKSkKCnJlcyA9IHJlc1stMSxdCnJlcyRodW1hbltyZXMkY2F1c2UgPT0xXSA9MQpyZXMkaHVtYW5bcmVzJGNhdXNlICE9MSAmIHJlcyRjYXVzZSAhPTE0XSA9MAoKYGBgCgphbmFseXNpcwoKYGBge3J9CgpvdXQxID0gcmVzW3JlcyRjYXVzZSAhPTEgJiByZXMkY2F1c2UgIT0gMTQsXSAKb3V0MiA9IHJlc1tyZXMkY2F1c2UgPT0xLF0gCgpvdXQxID0gc3Vic2V0KHJlcywoZWNvMSA9PSA2IHxlY28xID09IDcpICYgcmVzJGNhdXNlICE9MSAmIHJlcyRjYXVzZSAhPSAxNCkgICAjMT1saWdodG5pbmc7IDE0PXVua25vd247IDc9YXJzb24Kb3V0MiA9IHN1YnNldChyZXMsKGVjbzEgPT0gNiB8ZWNvMSA9PSA3KSAmIHJlcyRjYXVzZSA9PTEpICAgIzE9bGlnaHRuaW5nOyAxND11bmtub3duOyA3PWFyc29uCgpvdXQxID0gc3Vic2V0KHJlcyxlY28xID09IDExJiByZXMkY2F1c2UgIT0xICYgcmVzJGNhdXNlICE9IDE0KQpvdXQyID0gc3Vic2V0KHJlcyxlY28xID09IDExICYgcmVzJGNhdXNlID09MSkKCm91dDEgPSBzdWJzZXQocmVzLChlY28xID09IDYgfGVjbzEgPT0gNykgJiByZXMkY2F1c2UgIT0xICYgcmVzJGNhdXNlICE9IDE0ICYgcmVzJG1vbnQgPiA1ICYgcmVzJG1vbnQgPCAxMCApICAgIzE9bGlnaHRuaW5nOyAxND11bmtub3duOyA3PWFyc29uCm91dDIgPSBzdWJzZXQocmVzLChlY28xID09IDYgfGVjbzEgPT0gNykgJiByZXMkY2F1c2UgPT0xJiByZXMkbW9udCA+IDUgJiByZXMkbW9udCA8IDEwKSAgICMxPWxpZ2h0bmluZzsgMTQ9dW5rbm93bjsgNz1hcnNvbgoKdC50ZXN0KG91dDEkYmksb3V0MiRiaSkKdC50ZXN0KG91dDEkZXJjLG91dDIkZXJjKQp0LnRlc3Qob3V0MSRldHIsb3V0MiRldHIpCnQudGVzdChvdXQxJGZtMTAwLG91dDIkZm0xMDApCnQudGVzdChvdXQxJGZtMTAwMCxvdXQyJGZtMTAwMCkKdC50ZXN0KG91dDEkcGV0LG91dDIkcGV0KQp0LnRlc3Qob3V0MSRwcixvdXQyJHByKQp0LnRlc3Qob3V0MSRybWF4LG91dDIkcm1heCkKdC50ZXN0KG91dDEkcm1pbixvdXQyJHJtaW4pCnQudGVzdChvdXQxJHRoLG91dDIkdGgpCnQudGVzdChvdXQxJHRtbW4sb3V0MiR0bW1uKQp0LnRlc3Qob3V0MSR0bW14LG91dDIkdG1teCkKdC50ZXN0KG91dDEkdnBkLG91dDIkdnBkKQp0LnRlc3Qob3V0MSR2cyxvdXQyJHZzKQp0LnRlc3Qob3V0MSR3cyxvdXQyJHdzKQp0LnRlc3Qob3V0MSRiaW9tYXNzLG91dDIkYmlvbWFzcykKdC50ZXN0KG91dDEkbWVhbl9sYW5kLG91dDIkbWVhbl9sYW5kKQp0LnRlc3QobG9nMTAob3V0MSR0b3RhbF9hcmVhKSxsb2cxMChvdXQyJHRvdGFsX2FyZWEpKQoKCgpgYGAKCmBgYHtyfQoKdGEgPSB0YWJsZShyZXMkaHVtYW4scmVzJG1vbnQpCnBzID0gYmFycGxvdCh0YSwgYmVzaWRlPVRSVUUsIHlsYWI9Im51bWJlciBvZiBmaXJlcyIseHBkPVQseGxhYj0gIm1vbnRoIiwgeGF4dD0nbicseWxpbT1jKDAsMzAwKSwgYXhpcy5sdHk9MSxjZXgubGFiID0gMS40LGNleC5heGlzID0gMS4yICkKYXhpcygxLGF0PWMoMiw1LDgsMTEsMTQsMTcsMjAsMjMsMjYsMjksMzIsMzUpLCBsYWJlbHMgPWMoMToxMikseGxpbT1jKDAsMzYpLHhwZD1GICxjZXgubGFiID0gMS40LGNleC5heGlzID0gMS4zKQpsZWdlbmQoInRvcHJpZ2h0IixjKCJodW1hbiIsImxpZ2h0bmluZyIpLGZpbGwgPSBjKCJncmV5IiwgImJsYWNrIiksIGJ0eT0ibiIsY2V4PTEuNCkKdGV4dCgxLDI4NSwiYSkiLGNleD0xLjgpCm91dDEgPSBzdWJzZXQocmVzLGVjbzEgPT0gNiB8ZWNvMSA9PSA3KSAgICMxPWxpZ2h0bmluZzsgMTQ9dW5rbm93bjsgNz1hcnNvbgpvdXQyID0gc3Vic2V0KHJlcyxlY28xID09IDExKQoKdGEgPSB0YWJsZShvdXQxJGh1bWFuLG91dDEkbW9udCkKcHMgPSBiYXJwbG90KHRhLCBiZXNpZGU9VFJVRSwgeWxhYj0ibnVtYmVyIG9mIGZpcmVzIix4cGQ9VCwgeGF4dD0nbicseGxhYj0gIm1vbnRoIiwgeWxpbT1jKDAsMjAwKSwgYXhpcy5sdHk9MSxjZXgubGFiID0gMS40LGNleC5heGlzID0gMS4yICkKYXhpcygxLGF0PWMoMiw1LDgsMTEsMTQsMTcsMjAsMjMsMjYsMjksMzIsMzUpLCBsYWJlbHMgPWMoMToxMikseGxpbT1jKDAsMzYpLHhwZD1GLGNleC5sYWIgPSAxLjQsY2V4LmF4aXMgPSAxLjMgKQpsZWdlbmQoInRvcHJpZ2h0IixjKCJodW1hbiIsImxpZ2h0bmluZyIpLGZpbGwgPSBjKCJncmV5IiwgImJsYWNrIiksIGJ0eT0ibiIsY2V4PTEuNCkKdGV4dCgxLDE5MCwiYikiLGNleD0xLjgpCgp0YSA9IHRhYmxlKG91dDIkaHVtYW4sb3V0MiRtb250KQpwcyA9IGJhcnBsb3QodGEsIGJlc2lkZT1UUlVFLCB5bGFiPSJudW1iZXIgb2YgZmlyZXMiLHhwZD1ULHhheHQ9J24nLHhsYWI9ICJtb250aCIsIHlsaW09YygwLDIwMCksIGF4aXMubHR5PTEsY2V4LmxhYiA9IDEuNCxjZXguYXhpcyA9IDEuMiApCmF4aXMoMSxhdD1jKDIsNSw4LDExLDE0LDE3LDIwLDIzLDI2LDI5LDMyLDM1KSwgbGFiZWxzID1jKDE6MTIpLHhsaW09YygwLDM2KSx4cGQ9RixjZXgubGFiID0gMS40LGNleC5heGlzID0gMS4zICkKbGVnZW5kKCJ0b3ByaWdodCIsYygiaHVtYW4iLCJsaWdodG5pbmciKSxmaWxsID0gYygiZ3JleSIsICJibGFjayIpLCBidHk9Im4iLGNleD0xLjQpCnRleHQoMSwxOTAsImMpIixjZXg9MS44KQpgYGAKCgoKCmBgYHtyfQpkYXRhX3M9cmVhZC50YWJsZSgiL1VzZXJzL3N0aWpuaGFudHNvbi9Eb2N1bWVudHMvcHJvamVjdHMvVklJUlNfcm9zL2RhaWx5X21lYW5fcm9zX2ROQlJfVjYudHh0Iixyb3cubmFtZXM9TlVMTCkKcm93bmFtZXMoZGF0YV9zKSA8LSBjKCkKCmRhdGFfczEgPSBhcy5kYXRhLmZyYW1lKGRhdGFfc1ssMjoxOV0pCgoKbmFtZXMoZGF0YV9zMSkgPSBjKCJsb24iLCJsYXQiLCJmaXJlIiwibnJfZGF5IiwibWF4X2xhbmQiLCJtZWFuX2xhbmQiLCJlbGV2YXRpb24iLCJiaW9tYXNzIiwibWVhbl9yb3MiLCJyb3M5NSIsIm1lYW5fZG5iciIsImRuYnI5NSIsIm1lYW5fcmRuYnIiLCJyZG5icjk1IiwibWVhbl9CQV9yZWQiLCJCQV9yZWQ5NSIsImNhdXNlIiwic2l6ZSIpCmxlbmd0aChkYXRhX3MxJGxvbikKZGF0YV9zMSRtZWFuX3JvcyA9YXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoZGF0YV9zMSRtZWFuX3JvcykpCmRhdGFfczEkcm9zOTUgPWFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKGRhdGFfczEkcm9zOTUpKQpkYXRhX3MxJG1lYW5fZG5iciA9YXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoZGF0YV9zMSRtZWFuX2RuYnIpKQpkYXRhX3MxJGRuYnI5NSA9YXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoZGF0YV9zMSRkbmJyOTUpKQpkYXRhX3MxJG1lYW5fcmRuYnIgPWFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKGRhdGFfczEkbWVhbl9yZG5icikpCmRhdGFfczEkcmRuYnI5NSA9YXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoZGF0YV9zMSRyZG5icjk1KSkKZGF0YV9zMSRsb24gPWFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKGRhdGFfczEkbG9uKSkKZGF0YV9zMSRsYXQgPWFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKGRhdGFfczEkbGF0KSkKCmRhdGFfczEkbWVhbl9sYW5kW2lzLm5hKGRhdGFfczEkbWVhbl9sYW5kKV09ZGF0YV9zMSRtYXhfbGFuZFtpcy5uYShkYXRhX3MxJG1lYW5fbGFuZCldICNtZWFuIGxhbmRjb3ZlciBnaXZlcyBOQSB3aGVuIG9ubHkgb25lIGxhbmRjb3ZlciBpcyBwcmVzZW50CmRhdGFfczEkbWVhbl9sYW5kID1hcy5udW1lcmljKGFzLmNoYXJhY3RlcihkYXRhX3MxJG1lYW5fbGFuZCkpCmRhdGFfczEkbWVhbl9CQV9yZWQgPWFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKGRhdGFfczEkbWVhbl9CQV9yZWQpKQpkYXRhX3MxJEJBX3JlZDk1ID1hcy5udW1lcmljKGFzLmNoYXJhY3RlcihkYXRhX3MxJEJBX3JlZDk1KSkKZGF0YV9zMSRiaW9tYXNzID1hcy5udW1lcmljKGFzLmNoYXJhY3RlcihkYXRhX3MxJGJpb21hc3MpKQpkYXRhX3MxJGVsZXZhdGlvbiA9YXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoZGF0YV9zMSRlbGV2YXRpb24pKQpkYXRhX3MxJGNhdXNlID1hcy5udW1lcmljKGFzLmNoYXJhY3RlcihkYXRhX3MxJGNhdXNlKSkKZGF0YV9zMSRzaXplID1hcy5udW1lcmljKGFzLmNoYXJhY3RlcihkYXRhX3MxJHNpemUpKQoKZGF0YV9zMT1uYS5vbWl0KGRhdGFfczEpCgpzaGFwZSA9IHNoYXBlZmlsZSgiL1VzZXJzL3N0aWpuaGFudHNvbi9Eb2N1bWVudHMvZGF0YS92ZWdfY2FsaWZvcm5pYS9jYV9lY29fbDMvY2FfZWNvX2wzLnNocCIpCnB0cyA8LSBTcGF0aWFsUG9pbnRzKGRhdGFfczFbLGMoImxvbiIsImxhdCIpXSxQNFMubGF0bG9uKQpzaGFwZSA9IHNwVHJhbnNmb3JtKHNoYXBlLFA0Uy5sYXRsb24pCmVjbyA9IG92ZXIocHRzLCBzaGFwZSkKZGF0YV9zMSRMMUNPREUgPSBlY28kTkFfTDFDT0RFCmRhdGFfczEkTDNuYW1lID0gZWNvJFVTX0wzTkFNRQpkYXRhX3MxJEwxQ09ERSA9YXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoZGF0YV9zMSRMMUNPREUpKQoKI2RhdGFfczEkbG9nX3JvcyA9IGxvZzEwKGRhdGFfczEkbWVhbl9yb3MpCiNkYXRhX3MxJGxvZ19yb3M5NSA9IGxvZzEwKGRhdGFfczEkcm9zOTUpCiNkYXRhX3MxID0gZGF0YV9zMVtkYXRhX3MxJG1lYW5fcm9zID4wLF0KZGF0YV9zMSRodW1hbltkYXRhX3MxJGNhdXNlICE9MSAmIGRhdGFfczEkY2F1c2UgIT0xNCAmIGRhdGFfczEkY2F1c2UgIT0xN109MQpkYXRhX3MxJGh1bWFuW2RhdGFfczEkY2F1c2UgPT0xIF09MgoKZGF0YV9zMSRyb3Nfa20gPSAoZGF0YV9zMSRyb3M5NSAqMjQpLzEwMDAKZGF0YV90ZXN0ID0gZGF0YV9zMVtkYXRhX3MxJG1heF9sYW5kID09IDEsXQpkYXRhX3Rlc3QxID0gZGF0YV9zMVtkYXRhX3MxJEwxQ09ERSA9PSA2IHxkYXRhX3MxJEwxQ09ERSA9PSA3ICxdCmRhdGFfdGVzdDIgPSBkYXRhX3MxW2RhdGFfczEkTDFDT0RFID09IDExLF0KCmRhdGFfdGVzdDEgPSBkYXRhX3MxW2RhdGFfczEkaHVtYW4gPT0gMSAmIChkYXRhX3MxJEwxQ09ERSA9PSA2IHxkYXRhX3MxJEwxQ09ERSA9PSA3KSxdCmRhdGFfdGVzdDIgPSBkYXRhX3MxW2RhdGFfczEkaHVtYW4gPT0gMiAmIChkYXRhX3MxJEwxQ09ERSA9PSA2IHxkYXRhX3MxJEwxQ09ERSA9PSA3KSxdCgpkYXRhX3Rlc3QxID0gZGF0YV9zMVtkYXRhX3MxJGh1bWFuID09IDEgLF0KZGF0YV90ZXN0MiA9IGRhdGFfczFbZGF0YV9zMSRodW1hbiA9PSAyICxdCgpkYXRhX3Rlc3QxPW5hLm9taXQoZGF0YV90ZXN0MSkKZGF0YV90ZXN0Mj1uYS5vbWl0KGRhdGFfdGVzdDIpCgpwbG90KGRhdGFfczEkcm9zX2ttLCBkYXRhX3MxJG1lYW5fQkFfcmVkLGxvZz0ieCIseGxhYj0iUmF0ZS1vZi1TcHJlYWQgKGttL2RheSkiLHlsYWI9IlRyZWUgbW9ydGFsaXR5ICglKSIseGxpbT1jKDAuMDA1LDMwKSx4YXh0PSJuIixjZXguYXhpcz0xLjQgLGNleC5sYWI9MS40LGNleD0wLjgsIGNvbD0iYmxhY2siKQpheGlzKDEsYXQ9bWFya3MsbGFiZWxzPW1hcmtzLGNleC5heGlzPTEuNCApCnBvaW50cyhkYXRhX3Rlc3QyJHJvc19rbSwgZGF0YV90ZXN0MiRtZWFuX0JBX3JlZCxjZXg9MC44LCBjb2w9ImRhcmtncmV5IikKcG9pbnRzKGRhdGFfdGVzdDEkcm9zX2ttLCBkYXRhX3Rlc3QxJG1lYW5fQkFfcmVkLGNleD0wLjgsIGNvbD0ib3JhbmdlIikKCgptYXJrcz1jKDAuMDEsMC4xLDEsMTApCnRpZmYoIi9Vc2Vycy9zdGlqbmhhbnRzb24vRG9jdW1lbnRzL0RvY3VtZW50cy9hcnRpY3Vsb3MvZW5fcHJvY2Vzby9WSUlSU19yb3MvZmlnX2Jhc2Ffcm9zX2FsbF92My50aWYiLCB3aWR0aCA9IDUsIGhlaWdodCA9IDUsIHVuaXRzID0gJ2luJywgcmVzID0gMzAwKQpwbG90KGRhdGFfczEkcm9zX2ttLCBkYXRhX3MxJG1lYW5fQkFfcmVkLGxvZz0ieCIseGxhYj0iUmF0ZS1vZi1TcHJlYWQgKGttL2RheSkiLHlsYWI9IlRyZWUgbW9ydGFsaXR5ICglKSIseGxpbT1jKDAuMDA1LDMwKSx4YXh0PSJuIixjZXguYXhpcz0xLjQgLGNleC5sYWI9MS40LGNleD0wLjgsIGNvbD0iYmxhY2siKQpheGlzKDEsYXQ9bWFya3MsbGFiZWxzPW1hcmtzLGNleC5heGlzPTEuNCApCnBvaW50cyhkYXRhX3Rlc3QyJHJvc19rbSwgZGF0YV90ZXN0MiRtZWFuX0JBX3JlZCxjZXg9MC44LCBjb2w9ImRhcmtncmV5IikKcG9pbnRzKGRhdGFfdGVzdDEkcm9zX2ttLCBkYXRhX3Rlc3QxJG1lYW5fQkFfcmVkLGNleD0wLjgsIGNvbD0ib3JhbmdlIikKbGluZXMobG93ZXNzKGRhdGFfczEkcm9zX2ttLCBkYXRhX3MxJG1lYW5fQkFfcmVkLCBmPTAuNDEpLGNvbD0iYmxhY2siLCBsd2Q9MykKbGluZXMobG93ZXNzKGRhdGFfdGVzdDEkcm9zX2ttLCBkYXRhX3Rlc3QxJG1lYW5fQkFfcmVkLCBmPTAuNDEpLGNvbD0iZGFya2dvbGRlbnJvZDMiLCBsd2Q9MykKbGluZXMobG93ZXNzKGRhdGFfdGVzdDIkcm9zX2ttLCBkYXRhX3Rlc3QyJG1lYW5fQkFfcmVkLCBmPTAuNDEpLGNvbD0iZ3JheTQwIiwgbHdkPTMpCmxlZ2VuZCgidG9wbGVmdCIsbGVnZW5kPWMoImFsbCIsImh1bWFuIiwibGlnaHRuaW5nIiksY29sID0gYygiYmxhY2siLCJkYXJrZ29sZGVucm9kMyIsICJncmF5NDAiKSxsdHk9MSwgYnR5PSJuIixsd2QgPSAzLCBjZXg9MSkKZGV2Lm9mZigpCgoKCmRhdGFfdGVzdDEgPSBkYXRhX3MxW2RhdGFfczEkaHVtYW4gPT0gMSAmIGRhdGFfczEkbWF4X2xhbmQgPDEuNSxdCmRhdGFfdGVzdDIgPSBkYXRhX3MxW2RhdGFfczEkaHVtYW4gPT0gMiAmIGRhdGFfczEkbWF4X2xhbmQgPDEuNSxdCmRhdGFfZm9yZXN0ID0gZGF0YV9zMVtkYXRhX3MxJG1heF9sYW5kIDwxLjUsXQpkYXRhX3Rlc3QxPW5hLm9taXQoZGF0YV90ZXN0MSkKZGF0YV90ZXN0Mj1uYS5vbWl0KGRhdGFfdGVzdDIpCgpkYXRhX3MyID0gZGF0YV9zMVtkYXRhX3MxJHJvc19rbSA8MTAsXQpkYXRhX2ZvcmVzdF8xMCA9IGRhdGFfczJbZGF0YV9zMiRtYXhfbGFuZCA8MS41LF0KZGF0YV90ZXN0MV8xMCA9IGRhdGFfczJbZGF0YV9zMiRodW1hbiA9PSAxICYgZGF0YV9zMiRtYXhfbGFuZCA8MS41LF0KZGF0YV90ZXN0Ml8xMCA9IGRhdGFfczJbZGF0YV9zMiRodW1hbiA9PSAyICYgZGF0YV9zMiRtYXhfbGFuZCA8MS41LF0KZGF0YV90ZXN0MV8xMD1uYS5vbWl0KGRhdGFfdGVzdDFfMTApCmRhdGFfdGVzdDJfMTA9bmEub21pdChkYXRhX3Rlc3QyXzEwKQoKbWFya3M9YygwLjAxLDAuMSwxLDEwKQp0aWZmKCIvVXNlcnMvc3Rpam5oYW50c29uL0RvY3VtZW50cy9Eb2N1bWVudHMvYXJ0aWN1bG9zL2VuX3Byb2Nlc28vVklJUlNfcm9zL2ZpZ19iYXNhX3Jvc19mb3Jlc3RfdjMudGlmIiwgd2lkdGggPSA1LCBoZWlnaHQgPSA1LCB1bml0cyA9ICdpbicsIHJlcyA9IDMwMCkKcGxvdChkYXRhX2ZvcmVzdCRyb3Nfa20sIGRhdGFfZm9yZXN0JG1lYW5fQkFfcmVkLGxvZz0ieCIseGxhYj0iUmF0ZS1vZi1TcHJlYWQgKGttL2RheSkiLHlsYWI9IlRyZWUgbW9ydGFsaXR5ICglKSIseGxpbT1jKDAuMDA1LDMwKSx4YXh0PSJuIixjZXguYXhpcz0xLjQgLGNleC5sYWI9MS40LGNleD0wLjgsIGNvbD0iYmxhY2siKQpheGlzKDEsYXQ9bWFya3MsbGFiZWxzPW1hcmtzLGNleC5heGlzPTEuNCApCnBvaW50cyhkYXRhX3Rlc3QyJHJvc19rbSwgZGF0YV90ZXN0MiRtZWFuX0JBX3JlZCxjZXg9MC44LCBjb2w9ImRhcmtncmV5IikKcG9pbnRzKGRhdGFfdGVzdDEkcm9zX2ttLCBkYXRhX3Rlc3QxJG1lYW5fQkFfcmVkLGNleD0wLjgsIGNvbD0ib3JhbmdlIikKbGluZXMobG93ZXNzKGRhdGFfZm9yZXN0XzEwJHJvc19rbSwgZGF0YV9mb3Jlc3RfMTAkbWVhbl9CQV9yZWQsIGY9MC40MSksY29sPSJibGFjayIsIGx3ZD0zKQpsaW5lcyhsb3dlc3MoZGF0YV90ZXN0MV8xMCRyb3Nfa20sIGRhdGFfdGVzdDFfMTAkbWVhbl9CQV9yZWQsIGY9MC40MSksY29sPSJkYXJrZ29sZGVucm9kMyIsIGx3ZD0zKQpsaW5lcyhsb3dlc3MoZGF0YV90ZXN0Ml8xMCRyb3Nfa20sIGRhdGFfdGVzdDJfMTAkbWVhbl9CQV9yZWQsIGY9MC40MSksY29sPSJncmF5NDAiLCBsd2Q9MykKbGVnZW5kKCJ0b3BsZWZ0IixsZWdlbmQ9YygiYWxsIiwiaHVtYW4iLCJsaWdodG5pbmciKSxjb2wgPSBjKCJibGFjayIsImRhcmtnb2xkZW5yb2QzIiwgImdyYXk0MCIpLGx0eT0xLCBidHk9Im4iLGx3ZCA9IDMsIGNleD0xKQpkZXYub2ZmKCkKCm1hcmtzPWMoMC4wMSwwLjEsMSwxMCkKdGlmZigiL1VzZXJzL3N0aWpuaGFudHNvbi9Eb2N1bWVudHMvRG9jdW1lbnRzL2FydGljdWxvcy9lbl9wcm9jZXNvL1ZJSVJTX3Jvcy9maWdfYmFzYV9yb3NfZm9yZXN0X3Y0LnRpZiIsIHdpZHRoID0gNSwgaGVpZ2h0ID0gNSwgdW5pdHMgPSAnaW4nLCByZXMgPSAzMDApCnBsb3QoZGF0YV9mb3Jlc3Qkcm9zX2ttLCBkYXRhX2ZvcmVzdCRtZWFuX0JBX3JlZCxsb2c9IngiLHhsYWI9IlJhdGUtb2YtU3ByZWFkIChrbS9kYXkpIix5bGFiPSJUcmVlIG1vcnRhbGl0eSAoJSkiLHhsaW09YygwLjEsMTUpLHhheHQ9Im4iLGNleC5heGlzPTEuNCAsY2V4LmxhYj0xLjQsY2V4PTAuOCwgY29sPSJibGFjayIpCmF4aXMoMSxhdD1tYXJrcyxsYWJlbHM9bWFya3MsY2V4LmF4aXM9MS40ICkKcG9pbnRzKGRhdGFfdGVzdDIkcm9zX2ttLCBkYXRhX3Rlc3QyJG1lYW5fQkFfcmVkLGNleD0wLjgsIGNvbD0iZGFya2dyZXkiKQpwb2ludHMoZGF0YV90ZXN0MSRyb3Nfa20sIGRhdGFfdGVzdDEkbWVhbl9CQV9yZWQsY2V4PTAuOCwgY29sPSJvcmFuZ2UiKQpsaW5lcyhsb3dlc3MoZGF0YV9mb3Jlc3RfMTAkcm9zX2ttLCBkYXRhX2ZvcmVzdF8xMCRtZWFuX0JBX3JlZCwgZj0wLjQxKSxjb2w9ImJsYWNrIiwgbHdkPTMpCmxpbmVzKGxvd2VzcyhkYXRhX3Rlc3QxXzEwJHJvc19rbSwgZGF0YV90ZXN0MV8xMCRtZWFuX0JBX3JlZCwgZj0wLjQxKSxjb2w9ImRhcmtnb2xkZW5yb2QzIiwgbHdkPTMpCmxpbmVzKGxvd2VzcyhkYXRhX3Rlc3QyXzEwJHJvc19rbSwgZGF0YV90ZXN0Ml8xMCRtZWFuX0JBX3JlZCwgZj0wLjQxKSxjb2w9ImdyYXk0MCIsIGx3ZD0zKQpsZWdlbmQoInRvcGxlZnQiLGxlZ2VuZD1jKCJhbGwiLCJodW1hbiIsImxpZ2h0bmluZyIpLGNvbCA9IGMoImJsYWNrIiwiZGFya2dvbGRlbnJvZDMiLCAiZ3JheTQwIiksbHR5PTEsIGJ0eT0ibiIsbHdkID0gMywgY2V4PTEpCmRldi5vZmYoKQoKCnBsb3QoZGF0YV9mb3Jlc3Qkcm9zX2ttLCBkYXRhX2ZvcmVzdCRtZWFuX0JBX3JlZCxsb2c9IngiLHhsYWI9IlJhdGUtb2YtU3ByZWFkIChrbS9kYXkpIix5bGFiPSJUcmVlIG1vcnRhbGl0eSAoJSkiLHhsaW09YygwLjEsMTUpLHhheHQ9Im4iLGNleC5heGlzPTEuNCAsY2V4LmxhYj0xLjQsY2V4PTAuOCwgY29sPSJibGFjayIpCmF4aXMoMSxhdD1tYXJrcyxsYWJlbHM9bWFya3MsY2V4LmF4aXM9MS40ICkKcG9pbnRzKGRhdGFfdGVzdDIkcm9zX2ttLCBkYXRhX3Rlc3QyJG1lYW5fQkFfcmVkLGNleD0wLjgsIGNvbD0iZGFya2dyZXkiKQpwb2ludHMoZGF0YV90ZXN0MSRyb3Nfa20sIGRhdGFfdGVzdDEkbWVhbl9CQV9yZWQsY2V4PTAuOCwgY29sPSJvcmFuZ2UiKQpsaW5lcyhsb3dlc3MoZGF0YV9mb3Jlc3RfMTAkcm9zX2ttLCBkYXRhX2ZvcmVzdF8xMCRtZWFuX0JBX3JlZCwgZj0wLjQxKSxjb2w9ImJsYWNrIiwgbHdkPTMpCmxpbmVzKGxvd2VzcyhkYXRhX3Rlc3QxXzEwJHJvc19rbSwgZGF0YV90ZXN0MV8xMCRtZWFuX0JBX3JlZCwgZj0wLjQxKSxjb2w9ImRhcmtnb2xkZW5yb2QzIiwgbHdkPTMpCmxpbmVzKGxvd2VzcyhkYXRhX3Rlc3QyXzEwJHJvc19rbSwgZGF0YV90ZXN0Ml8xMCRtZWFuX0JBX3JlZCwgZj0wLjQxKSxjb2w9ImdyYXk0MCIsIGx3ZD0zKQpsZWdlbmQoInRvcGxlZnQiLGxlZ2VuZD1jKCJhbGwiLCJodW1hbiIsImxpZ2h0bmluZyIpLGNvbCA9IGMoImJsYWNrIiwiZGFya2dvbGRlbnJvZDMiLCAiZ3JheTQwIiksbHR5PTEsIGJ0eT0ibiIsbHdkID0gMywgY2V4PTEpCgoKYGBgCgoKYGBge3J9CgpkYXRhX3Rlc3QgPSBkYXRhX3MxW2RhdGFfczEkbWF4X2xhbmQgPT0gMSxdCmRhdGFfdGVzdDEgPSBkYXRhX3MxW2RhdGFfczEkTDFDT0RFID09IDYgfGRhdGFfczEkTDFDT0RFID09IDcgLF0KZGF0YV90ZXN0MiA9IGRhdGFfczFbZGF0YV9zMSRMMUNPREUgPT0gMTEsXQoKZGF0YV90ZXN0MSA9IGRhdGFfczFbZGF0YV9zMSRodW1hbiA9PSAxICYgKGRhdGFfczEkTDFDT0RFID09IDYgfGRhdGFfczEkTDFDT0RFID09IDcpLF0KZGF0YV90ZXN0MiA9IGRhdGFfczFbZGF0YV9zMSRodW1hbiA9PSAyICYgKGRhdGFfczEkTDFDT0RFID09IDYgfGRhdGFfczEkTDFDT0RFID09IDcpLF0KCmRhdGFfdGVzdDEgPSBkYXRhX3MxW2RhdGFfczEkaHVtYW4gPT0gMSAsXQpkYXRhX3Rlc3QyID0gZGF0YV9zMVtkYXRhX3MxJGh1bWFuID09IDIgLF0KCgpmYXN0ID0gZGF0YV9zMVtkYXRhX3MxJHJvc19rbSA+IDEsXQpmYXN0X2h1bSA9IGZhc3RbZmFzdCRodW1hbiA9PSAxLF0KCnByaW50KCIlIEJBIGFuZCAlIG9mIGZpcmUgZGF5cyBmYXN0IGZpcmVzID4gMWttL2RheSIpCnN1bShmYXN0JHNpemUpL3N1bShkYXRhX3MxJHNpemUpCmxlbmd0aChmYXN0JHNpemUpL2xlbmd0aChkYXRhX3MxJHNpemUpCgpwcmludCgiJSBCQSAgZmFzdCBmaXJlcyBkdWUgdG8gaHVtYW4gaWduaXRpb24gJSBvZiBmaXJlIGRheXMgaHVtYW4gY2F1c2VkIGZhc3QgZmlyZXMgPiAxa20vZGF5IikKc3VtKGZhc3RfaHVtJHNpemUsIG5hLnJtPVQpL3N1bShmYXN0JHNpemUpCmxlbmd0aChmYXN0X2h1bSRzaXplKS9sZW5ndGgoZmFzdCRzaXplKQoKYWxsX21pbjEgPSBkYXRhX3MxW2RhdGFfczEkbnJfZGF5ICE9IDEsXSAjIHJlbW92ZSBmaXJzdCBmaXJlIHNwcmVhZCBkYXkgZnJvbSBzdGF0aXN0aWNzCgpxdWFuID0gcXVhbnRpbGUoZGF0YV9zMSRyb3Nfa20sMC45KQpmYXN0ID0gZGF0YV9zMVtkYXRhX3MxJHJvc19rbSA+IHF1YW4sXQpzbG93ID0gZGF0YV9zMVtkYXRhX3MxJHJvc19rbSA8IHF1YW4sXQpmYXN0X2h1bSA9IGZhc3RbZmFzdCRodW1hbiA9PSAxLF0KCnByaW50KCJmYXN0ZXN0IDEwJSBmaXJlcyBjYXVzZSB4eHglIG9mIEJBIikKc3VtKGZhc3Qkc2l6ZSkvc3VtKGFsbF9taW4xJHNpemUpCmxlbmd0aChmYXN0JHNpemUpL2xlbmd0aChhbGxfbWluMSRzaXplKQpwcmludCgibWVhbiB0cmVlIG1vcnRhbGl0eSB3ZWlnaHRlZCBieSBCQSBhbmQganVzdCBtZWFuIikKc3VtKChkYXRhX3MxJG1lYW5fQkFfcmVkKmRhdGFfczEkc2l6ZSkpLyhzdW0oZGF0YV9zMSRzaXplKSkKbWVhbihkYXRhX3MxJG1lYW5fQkFfcmVkKQoKcHJpbnQoIiUgQkEgZHVlIHRvIGh1bWFuIGZpcmVzIGFtb3VuZyBmYXN0ZXN0IDEwJSBmaXJlIGRheXMiKQpzdW0oZmFzdF9odW0kc2l6ZSwgbmEucm09VCkvc3VtKGZhc3Qkc2l6ZSkKcHJpbnQoIiUgZmlyZSBudW1iZXIgZHVlIHRvIGh1bWFuIGZpcmVzIGFtb3VuZyBmYXN0ZXN0IDEwJSBmaXJlIGRheXMiKQpsZW5ndGgoZmFzdF9odW0kc2l6ZSkvbGVuZ3RoKGZhc3Qkc2l6ZSkKcHJpbnQoIiUgdHJlZSBtb3J0YWxpdHkgZmFzdCBmaXJlcyB3ZWlnaHRoZWQgYW5kIG5vdCIpCnN1bSgoZmFzdCRtZWFuX0JBX3JlZCpmYXN0JHNpemUpKS8oc3VtKGZhc3Qkc2l6ZSkpCm1lYW4oZmFzdCRtZWFuX0JBX3JlZCkKcHJpbnQoIiUgdHJlZSBtb3J0YWxpdHkgc2xvdyBmaXJlcyB3ZWlnaHRoZWQgYW5kIG5vdCIpCnN1bSgoc2xvdyRtZWFuX0JBX3JlZCpzbG93JHNpemUpKS8oc3VtKHNsb3ckc2l6ZSkpCm1lYW4oc2xvdyRtZWFuX0JBX3JlZCkKCiMgcGxvdCBCQSBwZXIgcmF0ZSBvZiBzcHJlYWQgCm91dDEgPSBzdWJzZXQoZGF0YV9zMSxjYXVzZSA9PSAxICkgICAjMT1saWdodG5pbmc7IDE0PXVua25vd247IDc9YXJzb24Kb3V0MiA9IHN1YnNldChkYXRhX3MxLGNhdXNlICE9MSAmIGNhdXNlICE9IDE0ICkKCmJyZWFrcyA9YygwLDAuNSwxLDIsMyw1LDcsMTAsMjAsMzApCgp0dD0wCnBwPTAKZm9yIChpIGluIDE6OSl7CgogIGtyID0gb3V0MVtvdXQxJHJvc19rbSA+PSBicmVha3NbaV0gJiBvdXQxJHJvc19rbSA8IGJyZWFrc1tpKzFdLF0KICBrcCA9IG91dDJbb3V0MiRyb3Nfa20gPj0gYnJlYWtzW2ldICYgb3V0MiRyb3Nfa20gPCBicmVha3NbaSsxXSxdCgp0dFtpXT1zdW0oa3Ikc2l6ZSwgbmEucm09VCkvMTAwMDAwMApwcFtpXT0gc3VtKGtwJHNpemUsIG5hLnJtPVQpLzEwMDAwMDAKfQoKZmcgPSByYmluZCh0dCxwcCkKCnBhcihtYXI9Yyg0LCA1LCAyLDAuMSkpCmZyID0gYmFycGxvdChmZywgYmVzaWRlPVRSVUUseGxhYj0iUmF0ZS1vZi1TcHJlYWQgKGttL2RheSkiLHlsYWI9ZXhwcmVzc2lvbignYnVybnQgYXJlYSAoa20nXjIqJyknKSx5bGltPWMoMCwyMDAwKSxjZXgubGFiPTEuNCxjZXguYXhpcyA9IDEuMykKYXhpcygxLGF0PWMoMC41LDMuNSw2LjUsOS41LDEyLjUsMTUuNSwxOC41LDIxLjUsMjQuNSwyNy41KSxsYWJlbHM9aGlzdC5hJGJyZWFrcyxjZXguYXhpcyA9IDEuMykKbGVnZW5kKCJ0b3ByaWdodCIsbGVnZW5kID0gYygiaHVtYW4iLCJsaWdodG5pbmciKSwgZmlsbD1jKCJncmV5IiwiYmxhY2siKSxjZXg9MS40LGJ0eSA9ICJuIikKCgp0aWZmKCIvVXNlcnMvc3Rpam5oYW50c29uL0RvY3VtZW50cy9Eb2N1bWVudHMvYXJ0aWN1bG9zL2VuX3Byb2Nlc28vVklJUlNfcm9zL0JBX3Blcl9yb3NfaGlzdC50aWYiLCB3aWR0aCA9IDYsIGhlaWdodCA9IDUsIHVuaXRzID0gJ2luJywgcmVzID0gMzAwKQpwYXIobWFyPWMoNCwgNSwgMiwwLjEpKQpmciA9IGJhcnBsb3QoZmcsIGJlc2lkZT1UUlVFLHhsYWI9IlJhdGUtb2YtU3ByZWFkIChrbS9kYXkpIix5bGFiPWV4cHJlc3Npb24oJ2J1cm50IGFyZWEgKGttJ14yKicpJykseWxpbT1jKDAsMjAwMCksY2V4LmxhYj0xLjQsY2V4LmF4aXMgPSAxLjMpCmF4aXMoMSxhdD1jKDAuNSwzLjUsNi41LDkuNSwxMi41LDE1LjUsMTguNSwyMS41LDI0LjUsMjcuNSksbGFiZWxzPWhpc3QuYSRicmVha3MsY2V4LmF4aXMgPSAxLjMpCmxlZ2VuZCgidG9wcmlnaHQiLGxlZ2VuZCA9IGMoImh1bWFuIiwibGlnaHRuaW5nIiksIGZpbGw9YygiZ3JleSIsImJsYWNrIiksY2V4PTEuNCxidHkgPSAibiIpCmRldi5vZmYoKSAKCgoKCmBgYAoKCgoKV2hlbiB5b3Ugc2F2ZSB0aGUgbm90ZWJvb2ssIGFuIEhUTUwgZmlsZSBjb250YWluaW5nIHRoZSBjb2RlIGFuZCBvdXRwdXQgd2lsbCBiZSBzYXZlZCBhbG9uZ3NpZGUgaXQgKGNsaWNrIHRoZSAqUHJldmlldyogYnV0dG9uIG9yIHByZXNzICpDbWQrU2hpZnQrSyogdG8gcHJldmlldyB0aGUgSFRNTCBmaWxlKS4gCgpUaGUgcHJldmlldyBzaG93cyB5b3UgYSByZW5kZXJlZCBIVE1MIGNvcHkgb2YgdGhlIGNvbnRlbnRzIG9mIHRoZSBlZGl0b3IuIENvbnNlcXVlbnRseSwgdW5saWtlICpLbml0KiwgKlByZXZpZXcqIGRvZXMgbm90IHJ1biBhbnkgUiBjb2RlIGNodW5rcy4gSW5zdGVhZCwgdGhlIG91dHB1dCBvZiB0aGUgY2h1bmsgd2hlbiBpdCB3YXMgbGFzdCBydW4gaW4gdGhlIGVkaXRvciBpcyBkaXNwbGF5ZWQuCgoKCmBgYAoKCgoKCgo=